对于具有不同xml声明的xml,正确的XPath是什么?
我正在尝试为以下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
<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。