Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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
Python 使用XPath,如何处理包含冒号字符的属性?_Python_Xml_Xpath_Lxml - Fatal编程技术网

Python 使用XPath,如何处理包含冒号字符的属性?

Python 使用XPath,如何处理包含冒号字符的属性?,python,xml,xpath,lxml,Python,Xml,Xpath,Lxml,给定以下XML片段: <node id="b071f9fa-14b0-4217-8e97-eb41da73f598" type="Group" ext:score="90"> <node id="b071f9fa-14b0-4217-8e97-eb41da73f599" type="Person" ext:score="100"> <node id="b071f9fa-14b0-4217-8e97-eb41da73f600" type="Business" ext:

给定以下XML片段:

<node id="b071f9fa-14b0-4217-8e97-eb41da73f598" type="Group" ext:score="90">
<node id="b071f9fa-14b0-4217-8e97-eb41da73f599" type="Person" ext:score="100">
<node id="b071f9fa-14b0-4217-8e97-eb41da73f600" type="Business" ext:score="80">
返回一个异常:

lxml.etree.XPathEvalError: Undefined namespace prefix
我在这里和XPath文档中都读到,ext首先需要定义为有效的名称空间,因为如果DOM包含特殊字符,则无法将其解析为属性。然而,我一直无法找到一个好的例子来说明如何做到这一点。我正在处理的摘录中没有ext的定义,我不知道如何创建名称空间前缀


有什么想法吗?

XML属性或元素名称(如ext:score)中的冒号字符将名称空间前缀ext与本地名称score分开。名称空间前缀本身的重要性仅在于它们与名称空间值的关联

对于这个XML

<metadata xmlns:ext="http://musicbrainz.org/ns/mmd-2.0#">
  <node id="b071f9fa-14b0-4217-8e97-eb41da73f598" type="Group" ext:score="90">
  <node id="b071f9fa-14b0-4217-8e97-eb41da73f599" type="Person" ext:score="100">
  <node id="b071f9fa-14b0-4217-8e97-eb41da73f600" type="Business" ext:score="80">
</metadata>
将选择ext:score属性值为100的所有节点元素的id属性,前提是您可以将名称空间前缀ext绑定到名称空间值http://musicbrainz.org/ns/mmd-2.0 在调用XPath的语言或工具中

要将名称空间前缀绑定到Python中的名称空间值,请参见Python和其他语言示例:

from lxml import etree
f = StringIO('your XML here')
doc = etree.parse(f)
r = doc.xpath('//node[@ext:score="100"]/@id', 
              namespaces={'ext':'http://musicbrainz.org/ns/ext#-2.0'})

请注意,如果您的XML使用ext而不声明它,那么它就不可能与我读过的@kjhughes重复,我知道如何创建名称空间,但我不知道如何使用名称空间前缀来测试条件。还在看。。。谢谢您的XML是否有ext的名称空间声明—类似于xmlns:ext=http://example.com/extention 在节点元素上方的元素上?@kjhughes-我不知道这些元素是怎么来的,但我被告知原始元素包含以下内容:这是我用来尝试合成前缀的内容。现在工作得很好-非常感谢@kjhughes
//node[@ext:score="100"]/@id
from lxml import etree
f = StringIO('your XML here')
doc = etree.parse(f)
r = doc.xpath('//node[@ext:score="100"]/@id', 
              namespaces={'ext':'http://musicbrainz.org/ns/ext#-2.0'})