我在找到正确的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”NODE值,我假设我将使用此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语法提出建议吗?
感谢。
答案 0 :(得分:1)
我没有看到您的XPath有任何问题,除非您从未注册过文档节点所在的命名空间:
"http://schemas.microsoft.com/support/2003/02/config"
看起来你已经知道如何用你的语言(使用AddNamespace
),所以也许这只是一个疏忽。如果您需要更多信息,这应该有所帮助:
答案 1 :(得分:1)
正如@lwburk所说,你需要注册命名空间。
select语句应为:
var xmlNodeIterator = nav.Select("/ns:configuration/ns:name", nsmgr)