【问题标题】:Select XMLNode by Id using XPath使用 XPath 按 Id 选择 XMLNode
【发布时间】:2009-09-30 08:49:00
【问题描述】:

我有以下 XML 片段,请注意 Reference 节点包含一个链接到 Body 节点的 Id 属性的 URI。

 <Reference URI="#Body">
  <SOAP-ENV:Body Id="Body" xmlns:SOAP-ENV="http://www.dingo.org">
    <ns0:Add xmlns:ns0="http://www.moo.com">
      <ns0:a>2</ns0:a>
      <ns0:b>3</ns0:b>
    </ns0:Add>
  </SOAP-ENV:Body>

如果我有 URI 属性的值,我将如何获得整个 Body XMLNode?我认为这最好通过 XPath epression 完成,但对 XPath 没有任何线索。请注意,XML 并不总是那么简单。我在 c# 中做这个 btw :)

有什么想法吗?

谢谢

乔恩

编辑:我事先不知道 XML 结构或命名空间,我只知道引用元素具有我要检索的 xmlNode 的 ID,希望这更清楚。

【问题讨论】:

  • &lt;Reference&gt; 元素上的URI 属性的值(我假设你指的是)总是采用"#ID" 的形式,仅此而已?跨度>
  • Reference 元素是根元素吗?会一直这样吗?总是只有一个参考元素吗?是否只有一个元素的 Id 属性与 Reference 元素的 URI 属性匹配?

标签: c# xml xpath


【解决方案1】:

您可以将适用于相对(或绝对节点)的条件添加到 XPath 表达式的任何步骤。

在这种情况下:

//*[@id=substring-after(/Reference/@URI, '#')]

//* 匹配文档中的所有元素。 [] 中的部分是一个条件。在条件内部,获取根引用节点的 URI 元素部分,但忽略“#”(以及它之前的任何内容)。

示例代码,假设您已将 XML 加载到 XPathDocument doc

var nav = doc.CreateNavigator();
var found = nav.SelectSingleNode("//*[@id=substring-after(/Reference/@URI, '#')]");

【讨论】:

  • 对不起,我不太清楚你的意思,我也不会事先知道 XML 结构,基本上我收到了这个 XML,需要获取 URI 属性引用的节点参考标签
【解决方案2】:

如果变量中有 URI 属性的值,则可以使用

myXmlDocument.DocumentElement.SelectSingleNode("//SOAP-ENV:Body[ID='pURI']")

其中 pURI 是 URI 属性的值,myXmlDocument 是 Xml Document 对象

【讨论】:

  • 您需要添加命名空间映射。
【解决方案3】:

类似这样的:

XmlDocument requestDocument = new XmlDocument();
requestDocument.LoadXml(yourXmlString);
String someXml = requestDocument.SelectSingleNode(@"/*[local-name()='Reference ']/*[local-name()='Body']").InnerXml;

【讨论】:

  • "SOAP-ENV" 是命名空间标签,而不是本地名称。
  • 我不会事先知道 xml 结构或命名空间,请参阅我的编辑
猜你喜欢
  • 1970-01-01
  • 2019-02-10
  • 2020-09-27
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多