【问题标题】:Extract element from XML document [duplicate]从 XML 文档中提取元素 [重复]
【发布时间】:2013-04-04 04:51:08
【问题描述】:

有人可以告诉我如何在 .NET 3.5 Framework 下使用 XPath 和 C# 从下面的 XML 中提取 Errors 元素吗?

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:do_OTA_VehAvailRateRQResponse xmlns:ns1="urn:vanguard-web-webservices-ota-IOTA" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<return xsi:type="xsd:string"><OTA_VehAvailRateRS TimeStamp="2013-04-03T18:16:00" TransactionIdentifier="215997103" SequenceNmbr="1" Target="Production" Version="2.0" xmlns="http://www.opentravel.org/OTA/2003/05">
  <Errors>
    <Error Type="1" Code="999">COMPANY NAME FIELD IS INVALID</Error>
  </Errors>
</OTA_VehAvailRateRS>
</return>
</ns1:do_OTA_VehAvailRateRQResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

【问题讨论】:

  • 你能澄清一下你有什么问题吗?到目前为止,您已经发布了大量代码,很难看出您有问题的部分。
  • 这些可怕的问题如何获得支持?我们是否忽略了常见问题解答?现在?
  • 否决了这个问题。不发布失败代码的人当然不值得点赞。

标签: c# xml xpath


【解决方案1】:

如果您不向我们展示您的代码,我们将无法判断您哪里出错了。

但我们可以猜测。您的 Errors 元素位于命名空间中,而无法识别这一事实在没有经验的人中是一个常见的错误,我很乐意打赌这是您的错误。

要在命名空间中查找元素,您需要一个路径,例如 //e:Errors,其中前缀 e 绑定(在 C# API 级别)到命名空间 http://www.opentravel.org/OTA/2003/05

(抱歉,您并没有说您没有经验。我的推断是,如果您有经验,您会发布您的 XPath 代码)。

【讨论】:

  • 恕我直言,告诉人们他们在回答中“缺乏经验”并重申这一说法并不值得骄傲。我们都缺乏经验——在任何领域——在一定程度上。所以说一个没有经验的人并没有给我们一点新信息。
  • 是的,绑定到命名空间是问题所在。我的困惑源于命名空间opentravel.org/OTA/2003/05 没有在 XML 中添加前缀,因此我不知道在路径中使用什么前缀。解决方案是简单地创建一个前缀,例如“ota”(我可以将其命名为“WTF”),绑定名称空间并在 XPAth 中使用 ota 前缀。
  • @Dimitre 问题是,当人们不向我们展示他们的代码时,我们必须进行猜测,其中一部分猜测是猜测他们的经验水平,因为这决定了他们的错误类型可能正在制作。所以我只是在描述我的推理过程,而不是暗示任何批评。
  • @Michael 没有冒犯。
【解决方案2】:

试试这个代码:

XmlDocument xmlDoc = new XmlDocument();

xmlDoc .LoadXml(xmlSting); //If u have a xml string, you can create xmlDocument like this, otherwise u can use file name to create xmlDocument.

String error = .SelectSingleNode("SOAP-ENV:Envelope/SOAP-ENV:Body/return/Errors/Error").Value;

【讨论】:

    【解决方案3】:
    XmlNodeList errorNodes=new XmlDocument().Load("xmlFilePath").GetElementsByTagName("Errors");
    

    【讨论】:

      【解决方案4】:

      使用

      //*[name()='Errors']
      

      这会选择 XML 文档中名称为“Errors”的任何元素——无论元素的命名空间如何。

      或者,如果您想更精确并考虑到元素所在的确切名称空间,您需要使用 XmlNamespaceManager 对象并使用其注册前缀和名称空间之间的任何所需关联AddNamespace() method

      【讨论】:

      • 这是一个糟糕的建议,因为路径表达式取决于源中使用的命名空间前缀。如果你真的想要一个独立于命名空间的查询,使用//*[local-name()='Errors']
      • @MichaelKay,一般来说这可能是一个“糟糕的推荐”,但在这种情况下,想要的 Errors 元素没有前缀,XPath 表达式使用了这个事实。 在一般情况下选择一个元素而不考虑前缀可能会选择具有相同本地名称但属于不同命名空间的元素 - this 是一个糟糕的建议!此外,您还没有读到最后的答案,或者您会看到使用注册命名空间的确切解决方案的建议——带有文档和代码示例的链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多