XPATH 帮助:使用 XPathNodeIterator 在命名空间中查找 XML 节点
Posted
技术标签:
【中文标题】XPATH 帮助:使用 XPathNodeIterator 在命名空间中查找 XML 节点【英文标题】:XPATH Help: Finding XML Nodes in a Namespace with XPathNodeIterator 【发布时间】:2011-03-23 19:15:51 【问题描述】:我无法找到正确的 XPATH 语法来使用此 XML 文件获取我想要的节点。一方面,XML 中没有 NameSPace,所以我必须在代码中添加一个。我认为这会影响我的 XPATH。
我有一个如下所示的 XML 文件:
<configuration xmlns="http://schemas.microsoft.com/support/2003/02/config">
<name>Content</name>
<description>Desc</description>
<lastModifiedBy>Me</lastModifiedBy>
<lastModifiedDate>2011-04-18T14:05:00</lastModifiedDate>
<section name="MaintenanceNotices">
<key name="MaintenanceNote1" value="The Title Value" />
<link id="1234" type="5" href="" target="_self" name="MaintenanceNote1a">
<description>Description</description>
</link>
</section>
</configuration>
所以,对于 XPATH,如果我想在“CONFIGURATION”元素中获取“NAme”节点值,我假设我会使用这个 XPATH:
/configuration/name
但有时我需要将 ns: 添加到它:
/ns:configuration/ns:name
然后我可以像这样找到元素值:
while (xmlNodeIterator.MoveNext())
result += xmlNodeIterator.Current.SelectSingleNode("name", nsmgr).ToString();
但这根本不适合我。无论我尝试什么 xpath,它都不会在 XML 中找到任何值。这是我的代码:
private string GetXML()
string result = string.Empty;
string fileName = "Content.xml";
string filePath = "C:\\Content\\0";
XPathDocument xdoc = new XPathDocument(string.Format(filePath, fileName));
var nav = xdoc.CreateNavigator();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());
nsmgr.AddNamespace("ns", "http://schemas.microsoft.com/taxonomy/2003/1");
nsmgr.AddNamespace("gds", "http://support.microsoft.com/common/schemas/gdsPage/1/");
string sectionName = "MaintenanceNotices";
string xpath = "/configuration";
// section[name=0]"; ///key[name=MaintenanceNote1]/";
XPathNodeIterator xmlNodeIterator = nav.Select(string.Format(xpath, sectionName), nsmgr);
while (xmlNodeIterator.MoveNext())
result += xmlNodeIterator.Current.SelectSingleNode("name", nsmgr).ToString();
return result;
您能看到任何问题,或者对我的 Xpath 语法提出建议吗?
谢谢。
【问题讨论】:
XPath doesn't work as desired in C#的可能重复 【参考方案1】:我认为您的 XPath 没有任何问题,只是您从未注册文档节点所在的命名空间:
"http://schemas.microsoft.com/support/2003/02/config"
看起来你已经知道如何用你的语言做到这一点(使用AddNamespace
),所以这可能只是一个疏忽。如果您需要更多信息,这应该会有所帮助:
【讨论】:
我明白了,我必须在每个节点的前面添加 ns: 以告诉 xpath 我要查找的节点在我指定的命名空间中。我会试一试。谢谢。 @Shawn - 除非我遗漏了什么,否则您将ns
绑定到http://schemas.microsoft.com/taxonomy/2003/1
,但您的文档使用http://schemas.microsoft.com/support/2003/02/config
命名空间。
我的命名空间错误。这就是问题所在。尊重命名空间!非常感谢。
好点。我会记住这一点。我已经接受了 lwburks 的回答,并且从这里开始我的所有帖子都会这样做。谢谢。【参考方案2】:
正如@lwburk 所说,您需要注册命名空间。
select 语句应该是:
var xmlNodeIterator = nav.Select("/ns:configuration/ns:name", nsmgr)
【讨论】:
以上是关于XPATH 帮助:使用 XPathNodeIterator 在命名空间中查找 XML 节点的主要内容,如果未能解决你的问题,请参考以下文章