繁体   English   中英

使用XPath按Id选择XMLNode

[英]Select XMLNode by Id using XPath

我有以下的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,希望这是更清晰。

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

在这种情况下:

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

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

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

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

如果您在可以使用的变量中具有URI属性的值

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

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

像这样的东西:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM