我正在尝试访问UPS跟踪信息,并且根据他们的示例,我需要构建一个类似的请求:
<?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>
我在使用C#中的1个XmlDocument创建此问题时出现问题。当我尝试添加第二个时:
<?xml version="1.0" ?> or the <TrackRequest>
它会抛出一个错误:
System.InvalidOperationException:这个 文件已经有了 'DocumentElement'节点。
我猜这是因为标准的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 :(得分:9)
XML文档只能有一个根节点。否则它的形成不好。如果您需要一次发送两个文档,则需要创建2个xml文档并将它们连接在一起。
答案 1 :(得分:2)
因为你试图创建无效的xml而引发异常。 XmlDocument只会生成格式良好的xml。
您可以使用XMLWriter并将XmlWriterSettings.ConformanceLevel设置为Fragment,也可以创建两个XmlDocuments并将它们写入同一个流中。
答案 2 :(得分:0)
构建两个单独的XML文档并连接它们的字符串表示。
答案 3 :(得分:0)
看起来你的节点结构总是一样的。 (我没有看到任何条件逻辑。)如果结构是常量,您可以定义XML模板字符串。将该字符串加载到XML Document&amp;执行SelectNode以填充单个节点。
这可能比以编程方式创建根,元素和&amp;更简单/更清晰。节点