我有以下的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,希望这更加清晰。答案 0 :(得分:3)
您可以将适用于相对(或绝对节点)的条件添加到XPath表达式的任何步骤。
在这种情况下:
//*[@id=substring-after(/Reference/@URI, '#')]
//*
匹配文档中的所有元素。 []
中的部分是一个条件。在条件内部,将引用根References节点的URI元素的一部分,但忽略'#'(以及它之前的任何内容)。
示例代码,假设您已将XML加载到XPathDocument
doc
:
var nav = doc.CreateNavigator();
var found = nav.SelectSingleNode("//*[@id=substring-after(/Reference/@URI, '#')]");
答案 1 :(得分:1)
如果您在变量中具有URI属性的值,则可以使用
myXmlDocument.DocumentElement.SelectSingleNode("//SOAP-ENV:Body[ID='pURI']")
其中pURI是URI属性的值,myXmlDocument是Xml Document对象
答案 2 :(得分:0)
这样的事情:
XmlDocument requestDocument = new XmlDocument();
requestDocument.LoadXml(yourXmlString);
String someXml = requestDocument.SelectSingleNode(@"/*[local-name()='Reference ']/*[local-name()='Body']").InnerXml;