【问题标题】:Strange XPath behavior using XML namespaces on XPather.com?在 XPather.com 上使用 XML 命名空间的奇怪 XPath 行为?
【发布时间】:2020-03-31 09:43:36
【问题描述】:

我有以下 XML:

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
          xmlns:o="urn:schemas-microsoft-com:office:office"
          xmlns:x="urn:schemas-microsoft-com:office:excel"
          xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
          xmlns:html="http://www.w3.org/TR/REC-html40">
  <Names>
    <NamedRange ss:Name="SomeNamedRange" ss:RefersTo="=Control!R1C1:R51C4"/>
  </Names>
  <Worksheet ss:Name="Control" ss:Protected="1">
    <Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="51">
      <Row>
        <Cell ss:StyleID="s145">          
          <Comment ss:Author="Some comment here">
            <ss:Data xmlns="http://www.w3.org/TR/REC-html40"></ss:Data>
          </Comment>          
        </Cell>
      </Row>      
    </Table>
  </Worksheet>
</Workbook>

我想用 XPath 获取 Names 元素,所以我尝试:

//Names

但这不起作用。到目前为止,我已经找到了许多解决此问题的方法。

//ss:Names
//*:Names
//*[local-name()='Names']

或者,我可以删除以下元素:

<ss:Data xmlns="http://www.w3.org/TR/REC-html40"></ss:Data>

很明显,这与命名空间有关,但我仍然不明白发生了什么。所以我有两个问题:

  1. 为什么删除ss:Data 元素会影响读取Names 元素?
  2. 鉴于在顶部声明了 5 个命名空间,为什么 Names 元素被认为在 ss 命名空间中(当 ss:Data 元素存在时)?
  3. 这里正确的一般方法是什么?我觉得我缺少一些关于 XML 或 XPath 的一般信息

编辑:

此问题不仅限于http://xpather.com/。我在不同的 XPath 网站上得到了各种结果,并总结了结果here

【问题讨论】:

  • 您的ss 前缀指的是与xmlnsurn:schemas-microsoft-com:office:spreadsheet 定义的默认命名空间相同的命名空间。正是该值定义了元素所属的命名空间,而不是前缀。所以所有ss-前缀元素和所有非前缀元素都属于同一个命名空间urn:schemas-microsoft-com:office:spreadsheet&lt;ss:Data xmlns="http://www.w3.org/TR/REC-html40"&gt; 更改了其子级的默认命名空间,因此内部的无前缀 Names 将不符合 urn:schemas-microsoft-com:office:spreadsheet 的条件。
  • 啊,好吧,我想我明白了第一点。至于第二部分,&lt;Names&gt;元素不是&lt;ss.Data&gt;元素的子元素,为什么会受到它的影响?
  • 这很重要,因为您不能只在 C# 的 XPath 中使用前缀,您需要先在 one wayanother 中声明它。请从 C# 尝试并发布结果。
  • 重复链接将向未来的读者解释如何将 XPath 与命名空间一起使用。抱歉,但考虑到您对问题的命名方式,它们的数量会比您的数量多。您的特定问题要窄得多:您在 xpather.com 中偶然发现了一个错误。请注意,它们的默认 XML 有以下关于命名空间的免责声明:支持 XPath 2.0,但 命名空间仍在添加中,它们可能还没有完全工作。你是对的感到困惑: 只是删除ss:Data 不应该导致//Names 突然选择一些东西。
  • ...完成。不客气。与 XPather.com 一样的任何其他在线 XPath 站点也将不兼容。如果您发现任何问题,请告诉我们。我已通过电子邮件将此 Q/A 的链接发送至 xpather.com@gmail.com

标签: c# xml xpath xml-namespaces


【解决方案1】:

你的困惑是对的。

Workbook 声明默认命名空间urn:schemas-microsoft-com:office:spreadsheet 时,仅删除ss:Data 不应导致//Names 突然选择WorkbookNames 子级。您似乎偶然发现了xpather.com 中的一个错误。请注意,它们打开的默认 XML 具有以下关于名称空间的免责声明:

此应用程序处于早期测试版,所以请 宽恕。支持 XPath 2.0,但 命名空间仍在开发中 已添加,它们可能尚未完全正常工作。请发送您的 cmets 至:xpather.com@gmail.com

另请参阅(有关命名空间中的一般 XPath 指南):


另一个 xpather.com 问题

目前,xpather.com 不理解元素名称可能包含句点 (.) 字符。


还有一个 xpather.com 问题

这个完全兼容的 XPath,

//item/comment()[not(preceding-sibling::*)]

在 xpather.com 上导致以下(不正确的)错误消息:

TypeError: 无法读取未定义的属性“childPosition”

【讨论】:

  • 谢谢。我没有注意到 beta 评论,但我会密切关注 xpather,因为它到目前为止看起来不错。我已将我的结果添加到 this answer 中的各个网站,以防它对未来的访问者有用。
【解决方案2】:

我决定将其添加为答案而不是对原始问题进行编辑,因为我可能仍然遗漏了一些东西,但感谢@GSerg 和@kjhughes 的评论/答案,我做了一些调查。如果这证明有用,我可以编辑问题并将其添加进去。

以下只是一些用于在线 XPath 评估的网站,以及它们在我的场景中的表现。

+--------------------------------------------------------+--------------+-------------+------------+------------+
|                                                        |     With <ss:Data>         |    Without <ss:Data>    |
+--------------------------------------------------------+--------------+-------------+------------+------------+
|                                                        | //Names      | //ss:Names  | //Names    | //ss:Names |
+--------------------------------------------------------+--------------+-------------+------------+------------+
| https://www.freeformatter.com/xpath-tester.html        | No Match     | Match       | Match      | Match      |
| https://codebeautify.org/Xpath-Tester                  | No Match     | No Match    | No Match   | No Match   |
| http://xpather.com/                                    | No Match     | Match       | Match      | Match      |
| https://www.webtoolkitonline.com/xml-xpath-tester.html | No Match     | Error       | No Match   | Error      |
| http://www.utilities-online.info/xpath/#.Xe4VtTP7QuU   | No Match     | No Match    | No Match   | No Match   |
| https://extendsclass.com/xpath-tester.html             | No Match     | Match       | No Match   | Match      |
+--------------------------------------------------------+--------------+-------------+------------+------------+

根据我目前对答案的理解,唯一表现得完全明智的似乎是ExtendsClass,尽管freeformatterxpather 在指定命名空间时确实会产生正确的结果。

还应该指出的是,xpather 确实清楚地宣布了它的测试状态,并且还有一个漂亮的 UI。

【讨论】:

    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2017-05-10
    相关资源
    最近更新 更多