我想在XML中找到一个简单的元素(Name):
<ZoneContentMapping>
<ZoneContent>
<ContentId>72503</ContentId>
<StorefrontZoneId>Name</StorefrontZoneId>
<Type>ContentZone</Type>
</ZoneContent>
</ZoneContentMapping>
我在做:
XmlNodeList objNode =
objXML.SelectNodes("ZoneContentMapping/ZoneContent[ContentId='72503']/StorefrontZoneId");
我的节点数始终为零,我哪里错了?
答案 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);