2009-07-09 77 views
3

我试图访问UPS跟踪信息,并按照他们的榜样,我需要建立像这样的请求:C#的XmlDocument节点

<?xml version="1.0" ?> 
<AccessRequest xml:lang='en-US'> 
    <AccessLicenseNumber>YOURACCESSLICENSENUMBER</AccessLicenseNumber> 
    <UserId>YOURUSERID</UserId> 
    <Password>YOURPASSWORD</Password> 
</AccessRequest> 
<?xml version="1.0" ?> 
<TrackRequest> 
    <Request> 
    <TransactionReference> 
     <CustomerContext>guidlikesubstance</CustomerContext> 
    </TransactionReference> 
    <RequestAction>Track</RequestAction> 
    </Request> 
    <TrackingNumber>1Z9999999999999999</TrackingNumber> 
</TrackRequest> 

我有1 XmlDocument的创建这是一个问题C#。当我尝试添加第二个: <?xml version="1.0" ?> or the <TrackRequest> 它抛出一个错误:

System.InvalidOperationException: This document already has a 'DocumentElement' node.

我猜这是因为标准的XmlDocument只会有1个根节点。有任何想法吗?

继承人到目前为止我的代码:

XmlDocument xmlDoc = new XmlDocument(); 
XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null); 
XmlElement rootNode = xmlDoc.CreateElement("AccessRequest"); 
rootNode.SetAttribute("xml:lang", "en-US"); 
xmlDoc.InsertBefore(xmlDeclaration, xmlDoc.DocumentElement); 
xmlDoc.AppendChild(rootNode); 

XmlElement licenseNode = xmlDoc.CreateElement("AccessLicenseNumber"); 
XmlElement userIDNode = xmlDoc.CreateElement("UserId"); 
XmlElement passwordNode = xmlDoc.CreateElement("Password"); 

XmlText licenseText = xmlDoc.CreateTextNode("mylicense"); 
XmlText userIDText = xmlDoc.CreateTextNode("myusername"); 
XmlText passwordText = xmlDoc.CreateTextNode("mypassword"); 

rootNode.AppendChild(licenseNode); 
rootNode.AppendChild(userIDNode); 
rootNode.AppendChild(passwordNode); 

licenseNode.AppendChild(licenseText); 
userIDNode.AppendChild(userIDText); 
passwordNode.AppendChild(passwordText); 

XmlElement rootNode2 = xmlDoc.CreateElement("TrackRequest"); 
xmlDoc.AppendChild(rootNode2); 
+0

您可能想要将代码发布到发生错误的位置。否则,我们就像汽车维修技工一样,通过电话询问问题:“我的车不会启动,有什么问题?” – Cyberherbalist 2009-07-09 15:17:52

回答

9

XML文档只能有一个根节点。否则它不是很好的形成。如果您需要一次发送两个文档,您需要创建2个xml文档并将它们结合在一起。

0

构建两个独立的XML文档并连接它们的字符串表示。

2

它抛出一个异常,因为你试图创建无效的XML。 XmlDocument只会生成格式良好的xml。

您可以使用XMLWriter并将XmlWriterSettings.ConformanceLevel设置为Fragment,或者可以创建两个XmlDocuments并将它们写入同一个流中。

0

它看起来像你的节点结构总是相同的。 (我没有看到任何条件逻辑。)如果结构不变,您可以定义一个XML模板字符串。将该字符串加载到XML文档&中执行SelectNode来填充单个节点。

这可能比编程式创建根节点元素&更简单/更清洁。