【问题标题】:Using XPATH to access XML elements (was: Good tutorial to learn xpath)使用 XPATH 访问 XML 元素(是:学习 xpath 的好教程)
【发布时间】:2010-08-06 12:55:33
【问题描述】:

我正在努力学习 XPath。这个理论看起来非常简单,除了它不起作用。

我正在尝试获取每个目标元素的内容

XPathDocument doc = new XPathDocument(sPath);
XPathNavigator nav = doc.CreateNavigator();
XPathExpression expr;
expr = nav.Compile("/doc/file/body/trans-unit/target");
XPathNodeIterator iterator = nav.Select(expr);

while (iterator.MoveNext())
{
    XPathNavigator nav2 = iterator.Current.Clone();
    sbDoc.Append(nav2.InnerXml);
}

XML 文档如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<doc version="1.2">
  <file original="affiliate.php" source-language="EN-US" target-language="FR-FR" datatype="php">
    <header>
      <skl>
        <external-file href="affiliate.php"/>
      </skl>
    </header>
    <body>
      <trans-unit id="tu1">
        <source xml:lang="EN-US">Your Program Details</source>
        <target xml:lang="FR-FR">Your Program Details</target>
      </trans-unit>
      <trans-unit id="tu2">
        <source xml:lang="EN-US">Status</source>
        <target xml:lang="FR-FR">Status</target>
      </trans-unit>

这几乎是教程中的逐字逐句,但我无法让它发挥作用。创建迭代器后,在调试模式下,可以看到文档加载完毕,但是迭代器没有找到结果,跳过了While循环。

我可能在做一些非常愚蠢的事情,但是什么?

有人知道我在哪里可以找到好的、可靠的 XPATH 教程吗?


谢谢大家。结果我忽略了有一个命名空间的事实(我在简化 XML 代码时删除了它,因为我没有意识到它很重要),并且添加了命名空间管理器,代码工作正常。

我现在正在研究提出的 XPATH 教程,它们看起来不错。

【问题讨论】:

    标签: c# xml xpath


    【解决方案1】:

    也许 XML 不是您发布的,但有一个默认的命名空间声明。这就是初学者编写的 XPath 表达式不选择他们想要选择的内容的主要原因。在这种情况下,您需要一个 XmlNamespaceManager http://msdn.microsoft.com/en-us/library/6k4x060d.aspx

    【讨论】:

    • 谢谢马丁。你是对的,我在“简化”XML 文件时删除了原始名称空间,当然,现在它可以工作了。
    • @Sylverdrag:以及这个答案如何为您的问题标题提供服务“学习 xpath 的好教程”。我认为你应该编辑它。
    • @Alejandro:这是一个二合一问题,我不得不把它交给设法发现潜在问题的人,尽管我确实赞成好的教程答案。
    【解决方案2】:

    我会选择经典的W3Schools tutorial。我就是这样学习的,而且效果很好。绝对涵盖所有基础知识。

    【讨论】:

    • 看起来很棒的教程。谢谢!
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      我发现zvon上的教程挺好的。

      这里是XPath tutorial

      【讨论】:

        【解决方案5】:

        我一直觉得这个教程/参考非常有用... http://zvon.org/comp/r/tut-XPath_1.html#

        更新
        我使用了您的代码和 XML 文档,并且能够毫无问题地检索目标元素。我确实必须在您的 XML 文档末尾关闭您的 &lt;body&gt;, &lt;file&gt; and &lt;doc&gt; 元素,但我假设这是一个剪切和粘贴问题。我想我的问题是(这太明显了),您确定 XML 文档正在加载,并且加载的文档实际上具有您想要的内容吗?我复制了您的 XML 文档并在 XPathDocument 构造函数中对路径进行了硬编码,一切正常(意思是,StringBuilder 具有来自 &lt;target&gt; 元素的文本)。

        还尝试了 ANSI 和 UTF-8 编码——没问题。

        我在开发环境中使用 VS2010。

        【讨论】:

          【解决方案6】:

          http://www.w3schools.com/xsl/xpath_intro.asp

          顶部有教程,还有 xpath 参考。

          【讨论】:

            【解决方案7】:

            我迟到了,但会为求职者发帖。

            获取XPathbuilder。如果您想学习 xpath,请获取这个工具,一个示例扭曲的 xml 文件,打开 xpath 中的帮助部分并尝试一下。

            我现在正在使用它,我不敢相信我花了 5 分钟来选择我需要的东西。 (噩梦配置文件为 xml)。

            【讨论】:

              【解决方案8】:

              JQuery 支持基本的 XPath 表达式,您可以使用它来练习编写 XPath 选择器。

              【讨论】:

              • 贾!贾!我们总是看到关于 javascript(甚至关于 CSS)的技术问题的答案,建议使用 JQuery 之类的库。但我从未见过它被推荐为教程!
              【解决方案9】:

              我发现 .Net 中缺乏对强类型 xpath 的支持。这是一个使用 linq-esq 表达式生成 xpath 的库。

              http://www.syntaxsuccess.com/viewarticle/how-to-create-xpath-using-linq

              例子:

               var xpath = CreateXpath.Where(e => e.TargetElementName == "td" && 
                                                  e.TargetElementText.Contains("my test"));
              
               xpath generated: //td[contains(text(),'my test')]
              

              【讨论】:

                猜你喜欢
                • 2013-08-15
                • 2015-09-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-08-04
                • 1970-01-01
                相关资源
                最近更新 更多