在XPather.com上使用XML名称空间的奇怪XPath行为?

问题描述 投票:1回答:1

我有以下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']

OR,我可以删除以下元素:

<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的一些常规信息]
  4. [最终,我打算用C#读取此XML,但是到目前为止,我已经在各种在线XPath网站(例如http://xpather.com/)上执行了所有上述操作。

我具有以下XML:[[[]]

c# xml xpath xml-namespaces
1个回答
0
投票

您应该感到困惑。

仅删除ss:Data不会导致//Names声明Names的默认名称空间时Workbook突然选择Workbookurn:schemas-microsoft-com:office:spreadsheet子级。您似乎偶然发现了xpather.com中的错误。请注意,它们的默认XML具有以下关于名称空间的免责声明:
© www.soinside.com 2019 - 2024. All rights reserved.