C# XPathNavigator帮助

C# XPathNavigator帮助,c#,xml,xpath,xpathnavigator,C#,Xml,Xpath,Xpathnavigator,下面是我正在使用的XML示例(可从任何wiki的Special:Export/SomePage结果检索): 这不会返回任何结果。我做错了什么?欢迎使用XML名称空间。您需要在前缀和根元素的xmlns之间创建映射。例如,此代码对我有效: using (var r = File.OpenText("test.xml")) { XPathDocument xd = new XPathDocument(XmlReader.Create(r)); XPathNavigator xn = x

下面是我正在使用的XML示例(可从任何wiki的Special:Export/SomePage结果检索):


这不会返回任何结果。我做错了什么?

欢迎使用XML名称空间。您需要在前缀和根元素的
xmlns
之间创建映射。例如,此代码对我有效:

using (var r = File.OpenText("test.xml")) {
    XPathDocument xd = new XPathDocument(XmlReader.Create(r));
    XPathNavigator xn = xd.CreateNavigator();

    XmlNamespaceManager nsmgr = new XmlNamespaceManager(xn.NameTable);
    nsmgr.AddNamespace("mw", "http://www.mediawiki.org/xml/export-0.4/");

    XPathNodeIterator xni = xn.Select("/mw:mediawiki/mw:siteinfo", nsmgr);

    foreach (XPathNavigator nav in xni)
        Console.WriteLine(nav.Name);
}

进一步阅读,如果您感兴趣:。

为了增加额外的积分,是否可以通过XPathNavigator确定名称空间的url,或者我应该只使用正则表达式,因为我已经事先得到了字符串?没关系,我只是自己找到了一个:xn.MoveToFirstChild();nsmgr.AddNamespace(“mw”,xn.NamespaceURI);
StringReader strr = new StringReader(_rawData);
XPathDocument xd = new XPathDocument(XmlReader.Create(strr, Bot.XmlReaderSettings));
XPathNavigator xn = xd.CreateNavigator();
XPathNodeIterator xni = xn.Select("/mediawiki/siteinfo");
foreach (XPathNavigator nav in xni)
    Console.WriteLine(nav.LocalName);
using (var r = File.OpenText("test.xml")) {
    XPathDocument xd = new XPathDocument(XmlReader.Create(r));
    XPathNavigator xn = xd.CreateNavigator();

    XmlNamespaceManager nsmgr = new XmlNamespaceManager(xn.NameTable);
    nsmgr.AddNamespace("mw", "http://www.mediawiki.org/xml/export-0.4/");

    XPathNodeIterator xni = xn.Select("/mw:mediawiki/mw:siteinfo", nsmgr);

    foreach (XPathNavigator nav in xni)
        Console.WriteLine(nav.Name);
}