【问题标题】:XPathNavigator helpXPathNavigator 帮助
【发布时间】:2010-11-14 20:07:24
【问题描述】:

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

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en"> 
  <siteinfo> 
    <sitename>Wikipedia</sitename> 
    <base>http://en.wikipedia.org/wiki/Main_Page</base> 
    <generator>MediaWiki 1.16wmf4</generator> 
    <case>first-letter</case> 
    <namespaces> 
      <namespace key="-2" case="first-letter">Media</namespace> 
      <namespace key="-1" case="first-letter">Special</namespace> 
      <namespace key="0" case="first-letter" /> 
      ...
    </namespaces> 
  </siteinfo> 
</mediawiki> 

我已经尝试了所有我能想到的直接“跳转”到 siteinfo 节点并迭代结果的方法,除非我从根目录向下手动导航每个子节点,否则没有任何效果。我已经尝试了各种 .Move* 和 .Select* 方法的一百万种变体,看起来我只是在用头撞墙,但我当前的变体看起来像这样:

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);

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

【问题讨论】:

    标签: c# xml xpath xpathnavigator


    【解决方案1】:

    欢迎使用 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);
    }
    

    进一步阅读,如果您有兴趣:MSDN: XML Namespaces and How They Affect XPath and XSLT.

    【讨论】:

    • 对于额外的积分,是否可以通过 XPathNavigator 确定命名空间的 url,或者我应该只使用正则表达式,因为我事先已经得到了字符串?
    • 没关系,我自己想出了一个:xn.MoveToFirstChild(); nsmgr.AddNamespace("mw", xn.NamespaceURI);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2018-12-21
    • 1970-01-01
    • 2011-06-20
    • 2011-07-28
    • 2011-10-04
    • 2011-08-03
    相关资源
    最近更新 更多