Python 用lxml和elementtree解析XML

Python 用lxml和elementtree解析XML,python,xml,lxml,elementtree,Python,Xml,Lxml,Elementtree,我试图解析XML文档以返回包含ref属性的节点。玩具示例可以工作,但文档本身返回一个空数组,此时它应该显示匹配项 玩具示例 import elementtree.ElementTree from lxml import etree tree = etree.XML('<body><input ref="blabla"><label>Cats</label></input><input ref="blabla"><lab

我试图解析XML文档以返回包含
ref
属性的
节点。玩具示例可以工作,但文档本身返回一个空数组,此时它应该显示匹配项

玩具示例

import elementtree.ElementTree
from lxml import etree
tree = etree.XML('<body><input ref="blabla"><label>Cats</label></input><input ref="blabla"><label>Dogs</label></input><input ref="blabla"><label>Birds</label></input></body>')
# I can return the relevant input nodes with:
print len(tree.findall(".//input[@ref]"))
2

你知道为什么会失败,以及如何解决吗?我认为这可能与XML头有关。非常感谢您的帮助。

我认为问题在于您整个文档中的元素都是特定的名称空间,因此未命名的
.findall(“.//input[@ref]”)表达式与文档中的
input
元素不匹配,该元素实际上是一个命名的
input
元素,在
http://www.w3.org/2002/xforms
名称空间

所以不妨试试这个:

.findall(".//{http://www.w3.org/2002/xforms}input[@ref]")

在我最初的回答之后更新了,使用xforms名称空间而不是xhtml名称空间(正如在另一个回答中所指出的)。

我认为问题在于整个文档中的元素都是特定的名称空间,因此没有名称空间的
.findall(.//input[@ref]))
表达式与文档中的
输入
元素不匹配,该元素实际上是
http://www.w3.org/2002/xforms
名称空间

所以不妨试试这个:

.findall(".//{http://www.w3.org/2002/xforms}input[@ref]")

在我的原始答案之后更新了,以使用xforms名称空间而不是xhtml名称空间(如另一个答案中所述)。

从xml中可以看出,非前缀元素的xml名称空间是-
”http://www.w3.org/2002/xforms“
,这是因为它被定义为父元素
h:html
中没有任何前缀的
xmlns
,只有前缀为
h:
的元素的命名空间为
”http://www.w3.org/1999/xhtml“

因此,您还需要在查询中使用该名称空间。范例-

root.findall(".//{http://www.w3.org/2002/xforms}input[@ref]")
示例/演示-

>>> s = """<?xml version="1.0"?>
... <h:html xmlns="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...   <h:head>
...     <h:title>A title</h:title>
...   </h:head>
...   <h:body>
...     <group ref="blabla">
...       <label>Group 1</label>
...       <input ref="blabla">
...         <label>Field 1</label>
...       </input>
...     </group>
...   </h:body>
... </h:html>"""
>>> import xml.etree.ElementTree as ET
>>> root = ET.fromstring(s)
>>> root.findall(".//{http://www.w3.org/1999/xhtml}input[@ref]")
>>> root.findall(".//{http://www.w3.org/2002/xforms}input[@ref]")
[<Element '{http://www.w3.org/2002/xforms}input' at 0x02288EA0>]
>s=“”
... 
...   
…头衔
...   
...   
...     
…第一组
...       
…字段1
...       
...     
...   
... """
>>>将xml.etree.ElementTree作为ET导入
>>>root=ET.fromstring(s)
>>>root.findall(“)//{http://www.w3.org/1999/xhtml}输入[@ref]”)
>>>root.findall(“)//{http://www.w3.org/2002/xforms}输入[@ref]”)
[]

从xml中可以看出,非前缀元素的xml名称空间是-
”http://www.w3.org/2002/xforms“
,这是因为它被定义为父元素
h:html
中没有任何前缀的
xmlns
,只有前缀为
h:
的元素的命名空间为
"http://www.w3.org/1999/xhtml“

因此,您还需要在查询中使用该名称空间-

root.findall(".//{http://www.w3.org/2002/xforms}input[@ref]")
示例/演示-

>>> s = """<?xml version="1.0"?>
... <h:html xmlns="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...   <h:head>
...     <h:title>A title</h:title>
...   </h:head>
...   <h:body>
...     <group ref="blabla">
...       <label>Group 1</label>
...       <input ref="blabla">
...         <label>Field 1</label>
...       </input>
...     </group>
...   </h:body>
... </h:html>"""
>>> import xml.etree.ElementTree as ET
>>> root = ET.fromstring(s)
>>> root.findall(".//{http://www.w3.org/1999/xhtml}input[@ref]")
>>> root.findall(".//{http://www.w3.org/2002/xforms}input[@ref]")
[<Element '{http://www.w3.org/2002/xforms}input' at 0x02288EA0>]
>s=“”
... 
...   
...     头衔
...   
...   
...     
...       第一组
...       
...         字段1
...       
...     
...   
... """
>>>将xml.etree.ElementTree作为ET导入
>>>root=ET.fromstring(s)
>>>root.findall(“)//{http://www.w3.org/1999/xhtml}输入[@ref]”)
>>>root.findall(“)//{http://www.w3.org/2002/xforms}输入[@ref]”)
[]

什么是错误消息?什么是失败的?什么是错误消息?什么是失败的?嗨,sideshowbarker。很抱歉,我仍然是一个空数组。好的,我并没有实际测试它,但我现在会这样做,看看我得到了什么!
.findall(“)//{http://www.w3.org/2002/xforms}输入[@ref]”)
是票证:)嗨,sideshowbarker。很抱歉,我仍然是一个空数组。好的,我并没有实际测试它,但现在就做,看看我得到了什么!
。findall(“)//{http://www.w3.org/2002/xforms}输入[@ref]”
是票证:)