Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于具有不同xml声明的xml,正确的XPath是什么?_Xml_Xpath - Fatal编程技术网

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

对于具有不同xml声明的xml,正确的XPath是什么?,xml,xpath,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

我正在尝试为以下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吗?

/Assembly/Parts/Part/PartName

/Assembly/Parts/Part/PartName

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

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

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

我发现我必须在使用XPath:

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

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

声明/注册名称空间并在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']

它们又长又丑,但会起作用

声明/注册名称空间并在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']

它们又长又丑,但会起作用

小心任何声明的名称空间。我可以在您的节点中看到一个xmlns=“…”。如果您没有正确指定XML解析器,这可能会混淆它们。可能重复的I有一个名称空间,但无法在此处命名。名称空间URI是秘密吗?为什么不就这个问题编一个呢?我不明白你所说的“xml声明是一个节点”是什么意思。@sange:这不是问题,但请注意,相对URI已被弃用,请小心任何已声明的名称空间。我可以在您的节点中看到一个xmlns=“…”。如果您没有正确指定XML解析器,这可能会混淆它们。可能重复的I有一个名称空间,但无法在此处命名。名称空间URI是秘密吗?为什么不就这个问题编一个呢?我不明白你所说的“xml声明是一个节点”是什么意思。@sange:没问题,但是请注意,相对URI已经被弃用了,这是不正确的。这将选择命名空间URI为null或为空的元素。不正确。这将选择命名空间URI为null或为空的元素。+1来回答您自己的问题。仅供参考-XML声明是可选的(尽管建议使用)。它作为XML解析器的线索,但不影响已解析的信息集。因此,无论XPath是否在文档中,它都不会影响XPath。+1用于回答您自己的问题。仅供参考-XML声明是可选的(尽管建议使用)。它作为XML解析器的线索,但不影响已解析的信息集。因此,无论XPath是否在文档中,它都不会影响XPath。