C#Xpath查询以查找单个节点

时间:2009-09-25 20:48:28

标签: c# xpath

我想在XML中找到一个简单的元素(Name):

<ZoneContentMapping>  
 <ZoneContent> 
   <ContentId>72503</ContentId>  
   <StorefrontZoneId>Name</StorefrontZoneId>  
   <Type>ContentZone</Type>  
 </ZoneContent>
</ZoneContentMapping> 

我在做:

XmlNodeList objNode =  
objXML.SelectNodes("ZoneContentMapping/ZoneContent[ContentId='72503']/StorefrontZoneId");

我的节点数始终为零,我哪里错了?

5 个答案:

答案 0 :(得分:3)

是否涉及名称空间?我在分析Amazon AWS结果时遇到了类似的问题,结果证明我没有提供指定AWS命名空间的XmlNamespaceManager。

XmlNamespaceManager mgr = new XmlNamespaceManager(m_xml.NameTable);
mgr.AddNamespace("amzn", "http://s3.amazonaws.com/doc/2006-03-01/");

XmlNodeList nodes = xmlDoc.SelectNodes("//amzn:Contents", mgr);

名称空间前缀是任意的,但在XPath中似乎是必要的,即使XML本身没有使用名称空间前缀。我找不到告诉它将空名称空间前缀与指定的名称空间URL相关联的方法。

答案 1 :(得分:0)

XPath看起来不错,XML也是如此。在XmlSpy中尝试过,我得到“名字”,所以它应该工作。但是,尝试在开头添加一个额外的斜杠,以防万一...

XmlNodeList objNode = objXML.SelectNodes ("/ZoneContentMapping/ZoneContent[ContentId='72503']/StorefrontZoneId");

或者试试SelectSingleNode而不是......

答案 2 :(得分:0)

我认为这里的问题是执行查询的 context 。如果您在我在此处使用的XPath引擎中加载文档,则根上下文是唯一提供的节点ZoneContentMapping。请记住您的查询:

ZoneContentMapping/...

扩展为:

child::ZoneContentMapping/...

由于XPath中的默认轴为child。所以你的查询可能正在寻找一个名为ZoneContentMapping的ZoneContentMapping子代。糟糕。

尝试:

self::ZoneContentMapping/ZoneContent[ContentId='72503']/StorefrontZoneId

您还可以在查询前加/,该查询从XML文档的根目录进行搜索,无论您当前的上下文如何。

答案 3 :(得分:0)

此xpath有效:

ZoneContentMapping / ZoneContent / StorefrontZoneId [前同辈::内容识别= '72503']

这是一个很好的资源:

http://www.codeguru.com/csharp/csharp/cs_misc/designtechniques/print.php/c7589__1/

答案 4 :(得分:-1)

如果您愿意,可以采用另一种方式:

        string XmlFilePath = @"C:\blablabla"; 

        XmlDocument LoadXmlDoc = new XmlDocument();
        LoadXmlDoc.Load(XmlFilePath);

        XmlNodeList YourNodeList = LoadXmlDoc.GetElementsByTagName("StorefrontZoneId");

        LoadXmlDoc.Save(XmlFilePath);