2009-09-30 81 views
1

我有下面的XML格式,请注意,Reference节点包含一个链接到Body节点的Id属性的URI。使用XPath通过Id选择XMLNode

<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表达式来完成,但对XPath没有任何线索。请注意,XML并不总是那么简单。我在做c#btw :)

任何想法?

感谢

乔恩

编辑:我不知道前手的XML结构或命名空间,所有我想知道的是,参考元素有我想要检索的xmlNode的ID,希望这是比较清晰的。

+0

”元素上的URI属性的值(我认为,你指的是)总是以“#ID”的形式出现,而没有别的? – 2009-09-30 08:53:18

+0

这是正确的 – Jon 2009-09-30 08:55:21

+0

Reference元素是否为根元素?它会一直如此吗?会不会只有一个参考元素?是否只有一个元素的Id属性与Reference元素的URI属性匹配? – bambams 2009-09-30 14:51:03

回答

3

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

在这种情况下:

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

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

示例代码,假设你已经加载了XML到XPathDocumentdoc

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

对不起,我不太清楚你的意思,我也不知道XML的结构,基本上我收到这个XML,并需要获取参考标记中的URI属性所引用的节点 – Jon 2009-09-30 08:58:48

+0

将更新..一会儿。 – Richard 2009-09-30 09:01:39

1

如果你有一个可变的URI属性的值,你可以使用

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

其中普里是URI属性值和myXmlDocument是Xml Document对象

+0

您需要添加一个名称空间映射。 – Richard 2009-09-30 08:59:46

0

类似这样的:

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

“SOAP-ENV”是名称空间标记,而不是本地名称。 – Richard 2009-09-30 09:00:30

+0

我不会在手前知道xml strucutre或命名空间,请参阅我的编辑 – Jon 2009-09-30 09:02:41

+0

Richard:我的坏 – Philippe 2009-09-30 09:19:00