XPathNavigator 帮助

发布于 2024-10-02 18:51:41 字数 1394 浏览 0 评论 0原文

这是我正在使用的 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);

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

Here's a sample of the XML I'm working with (retrievable from any wiki's Special:Export/SomePage results):

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

I've tried everything I can think of to "jump" directly to the siteinfo node and iterate the results, and nothing works unless I navigate manually through each child node from the root down. I've tried a million variations of the various .Move* and .Select* methods and it seems I'm just bashing my head against a wall, but my current variant looks like this:

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

This returns no results. What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我的影子我的梦 2024-10-09 18:51:41

欢迎使用 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 命名空间及其如何影响 XPath 和 XSLT

Welcome to XML namespaces. You need to create a mapping between a prefix and the xmlns of the root element. For example, this code worked for me:

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

Further reading, in case you are interested: MSDN: XML Namespaces and How They Affect XPath and XSLT.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文