【问题标题】:C# XmlDocument NodesC# XmlDocument 节点
【发布时间】:2009-07-09 15:15:59
【问题描述】:

我正在尝试访问 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 创建它时遇到问题。当我尝试添加第二个时: &lt;?xml version="1.0" ?&gt; or the &lt;TrackRequest&gt; 它抛出一个错误:

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);

【问题讨论】:

  • 您可能希望发布发生错误的代码。否则,我们就像汽车修理工一样,在电话中被问到这样的问题:“我的车无法启动。出了什么问题?”
  • 另外,你确定他们提供的这个例子是针对一个请求的吗?它看起来更像是两种不同类型的请求。第一个是请求访问,第二个是请求跟踪信息。
  • 这正是他们的例子。我们在经典 ASP 中使用类似的东西,两个 xml 请求通过 Msxml2.ServerXMLHTTP 对象同时发送。
  • 奇怪,但如果请求是以字符串形式出现的,那么他们可以很容易地将两个根节点解析为两个部分。 @VVS 和 @MrPeregrination 似乎都知道如何做到这一点。这是针对哪个 UPS 跟踪服务?不知道他们这样做了——我可能想用它。
  • Cyber​​herbalist - 它返回货件的状态...类似于您通过其网站跟踪 UPS 包装时看到的...它将向您显示它经过的城市和状态在那个位置

标签: c# xml xmldocument


【解决方案1】:

一个 XML 文档只能有一个根节点。否则,它的格式不正确。如果您需要同时发送两个 xml 文档,则需要创建 2 个 xml 文档并将它们连接在一起。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        这可能比以编程方式创建根、元素和节点更简单/更简洁。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-21
          • 2015-06-07
          • 2017-05-01
          • 2015-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多