具有不同xml声明的xml的正确XPath是什么?

时间:2011-04-08 16:18:28

标签: xml xpath

我正在尝试为以下xml设置XPath查询:

<Assembly xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns="Assembly">
  <Parts>
    <Part>
      <PartName>Example</PartName>
    </Part>
  </Parts>
<Assembly>

我需要PartName元素而我无法正确引用它,因为xml声明是一个节点而不是通常的

<?xml version="1.0"?>

有人可以帮我构建我的XPath吗?

3 个答案:

答案 0 :(得分:2)

声明/注册命名空间并在XPath中使用命名空间前缀绝对是首选。

但是,如果您希望XPath在不注册命名空间的情况下工作,则可以使用以下任一XPath语句:

/*[local-name()='Assembly' and namespace-uri()='Assembly']
  /*[local-name()='Parts' and namespace-uri()='Assembly']
    /*[local-name()='Part' and namespace-uri()='Assembly']
      /*[local-name()='PartName' and namespace-uri()='Assembly']

这个更短,但更不“安全”,因为它只与元素名称匹配,并且不使用名称空间作为标准。

/*[local-name()='Assembly']
  /*[local-name()='Parts']
    /*[local-name()='Part']
      /*[local-name()='PartName']

它们长而丑,但会起作用。

答案 1 :(得分:1)

//装配/零件/部件/零件名称

答案 2 :(得分:1)

我发现我必须在使用XPath的C#程序中设置命名空间管理器:

XmlNamespaceManager nsMgr = new XmlNamespaceManager(Document.NameTable);
nsMgr.AddNamespace("sc", "Assembly");

并且XPath是//sc:Parts/sc:Part/sc:PartName