C# XmlDocument 节点

3

我正在尝试访问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#中的XmlDocument时遇到了问题。当我尝试添加第二个节点<?xml version="1.0" ?> or the <TrackRequest>时,它会抛出一个错误:

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

我猜想这是因为标准的XmlDocument只能有一个根节点。你有什么想法吗?
以下是我的代码:
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);

您可能希望发布出现错误的代码。否则我们就像被电话问到问题的汽车技工:“我的车启动不了,问题是什么?” - Cyberherbalist
另外,你确定他们提供的这个示例是针对一个请求吗?它看起来更像是两种不同类型的请求。第一个是请求访问权限,第二个是请求跟踪信息。 - Jay S
这正是他们的示例。我们在经典ASP中使用类似的东西,通过Msxml2.ServerXMLHTTP对象同时发送两个XML请求。 - Chris Klepeis
有点奇怪,但如果请求以字符串形式传递,则可以轻松地将两个根节点解析为两个部分。@VVS和@MrPeregrination似乎都知道如何做到这一点。这是哪个UPS跟踪服务?我不知道他们会这样做 - 我可能想使用它。 - Cyberherbalist
Cyberherbalist - 它的作用是返回货物的状态...类似于您在UPS网站上跟踪包裹时看到的内容...它将向您显示它经过的城市以及该位置的状态。 - Chris Klepeis
4个回答

9

一个XML文档只能有一个根节点,否则它就不是格式良好的。如果您需要同时发送两个文档,则需要创建2个XML文档并将它们合并在一起。


2

出现异常的原因是您试图创建无效的xml。XmlDocument只会生成格式良好的xml。

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


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

0

看起来你的节点结构总是一样的。(我没有看到任何条件逻辑。)如果结构是固定的,你可以定义一个XML模板字符串。将该字符串加载到XML文档中,并使用SelectNode来填充各个节点。

这可能比编程创建根、元素和节点更简单/更清晰。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接