2009-09-25 99 views
1

我想在一个XML找到一个简单的元素(名称):C#XPath查询找到一个节点

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

我做:

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

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

+1

你能显示初始化objXML的代码吗? – mjv 2009-09-25 20:56:10

+0

代码示例中的“objXML”是什么?请显示其类型,以及如何将上述示例XML加载到其中。 – 2009-09-25 20:58:38

+0

我在XmlDocument.LoadXml()代码片段中运行了SelectNodes XPath,并得到了您要查找的单个节点。它是更大的文档还是其他内容的一部分? – 48klocs 2009-09-25 20:59:25

回答

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相关联。

0

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

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

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

-1

这里是另一种方式,你可以去了解它,如果你想:

 string XmlFilePath = @"C:\blablabla"; 

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

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

     LoadXmlDoc.Save(XmlFilePath); 
0

我觉得这里的问题是背景在其执行查询。如果您在此处使用的XPath引擎中加载文档,则根环境是唯一提供的节点,即ZoneContentMapping。请记住,您的查询:

ZoneContentMapping/...

扩展为:

child::ZoneContentMapping/...

正如XPath的默认轴是child。因此,您的查询可能正在寻找名为ZoneContentMapping的ZoneContentMapping的子项。哎呀。

尝试:

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

您也可以在前面加上一个/到查询,这确实从XML文档的根搜索,不管你当前上下文的。

+0

在正常情况下,默认上下文是文档的_document node_,它将在XPath中变为根('/'),而不是根节点。 – 2009-09-26 05:45:03

0

这个XPath的工作原理:

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

,这里是一个很好的资源:

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

+1

你的XPath与他的语义不同?提示:问题中的“非工作”XPath并不以任何方式假定“StorefrontZoneId是ContentId的子项”。 – 2009-09-26 05:46:17

+0

这是非常不同的!另外,我使用了他的xml,并将xpath应用到它,并获得了所需的值'name'。我做的唯一不同的是使用XmlNode作为类型而不是XmlNodeList – ScottE 2009-09-26 12:32:15