默认情况下,当您调用ElementTree.parse(someXMLfile)时,Python ElementTree库会为每个已解析的节点添加前缀,并在Clark的Notation中使用它的命名空间URI:
{http://example.org/namespace/spec}mynode
这使得在代码中稍后按名称访问特定节点非常痛苦.
我已经阅读了有关ElementTree和命名空间的文档,看起来该iterparse()函数应该允许我改变解析器前缀命名空间的方式,但对于我的生活,我实际上无法让它改变前缀.似乎在ns-start事件发生之前可能会在后台发生这种情况,如下例所示:
for event, elem in iterparse(source):
if event == "start-ns":
namespaces.append(elem)
elif event == "end-ns":
namespaces.pop()
else:
...
Run Code Online (Sandbox Code Playgroud)
如何更改前缀行为以及函数结束时返回的内容是什么?
所以我使用Python 3.2.1的cElementTree解析一些XML文件,在解析过程中我发现有些标签缺少属性信息.我想知道是否有任何简单的方法来获取xml文件中这些元素的行号.
我有这个代码与ElementTree适用于Python 2.7.我需要在"X/Y"节点下获取名为"A"的所有节点.
from xml.etree.ElementTree import ElementTree
verboseNode = topNode.find("X/Y")
nodes = list(verboseNode.iter("A"))
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用Python 2.6运行它时,我遇到了这个错误.
ionCalculateSkewConstraint.py", line 303, in getNodesWithAttribute
nodes = list(startNode.iter(nodeName))
AttributeError: _ElementInterface instance has no attribute 'iter'
Run Code Online (Sandbox Code Playgroud)
看起来Python 2.6 ElementTree的节点没有iter().如何用Python 2.6实现iter()?
有没有办法忽略tage名称中的XML命名空间elementtree.ElementTree?
我尝试打印所有technicalContact标签:
for item in root.getiterator(tag='{http://www.example.com}technicalContact'):
print item.tag, item.text
Run Code Online (Sandbox Code Playgroud)
我得到类似的东西:
{http://www.example.com}technicalContact blah@example.com
Run Code Online (Sandbox Code Playgroud)
但我真正想要的是:
technicalContact blah@example.com
Run Code Online (Sandbox Code Playgroud)
有没有办法只显示后缀(sans xmlns),或更好 - 迭代元素而不明确说明xmlns?
我在python中学习ElementTree.一切似乎都很好,除非我尝试用前缀解析xml文件:
test.xml:
<?xml version="1.0"?>
<abc:data>
<abc:country name="Liechtenstein" rank="1" year="2008">
</abc:country>
<abc:country name="Singapore" rank="4" year="2011">
</abc:country>
<abc:country name="Panama" rank="5" year="2011">
</abc:country>
</abc:data>
Run Code Online (Sandbox Code Playgroud)
当我尝试解析xml时:
import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
xml.etree.ElementTree.ParseError: unbound prefix: line 2, column 0
Run Code Online (Sandbox Code Playgroud)
我是否需要指定一些内容才能解析带有前缀的xml文件?
尝试使用ElementTree解析包含未定义实体(即 )的XML :
ParseError: undefined entity
在Python 2.x中,可以通过创建解析器(文档)来更新XML实体dict :
parser = ET.XMLParser()
parser.entity["nbsp"] = unichr(160)
Run Code Online (Sandbox Code Playgroud)
但是如何用Python 3.x做同样的事情呢?
更新:我的方面存在误解,因为我parser.parser.UseForeignDTD(1)在尝试更新XML实体dict之前忽略了我的调用,这导致了解析器的错误.幸运的是,@ m.brindley耐心地指出,XML实体dict仍然存在于Python 3.x中,并且可以像在Python 2.x中那样进行更新.
我是元素树的新手,在这里我试图找到元素树中的元素数量.
from lxml import etree
root = etree.parse(open("file.xml",'r'))
Run Code Online (Sandbox Code Playgroud)
有没有办法找到root中元素的总数?
我想在我使用LXML的etree生成的XML文档中添加doctypes.
但是我无法弄清楚如何添加doctype.硬编码和连接字符串不是一种选择.
我期待着在etree中添加PI的方式:
pi = etree.PI(...)
doc.addprevious(pi)
Run Code Online (Sandbox Code Playgroud)
但这对我不起作用.如何使用lxml添加到xml文档?
我通过xpath废弃了一些html,然后我转换成了etree.与此类似的东西:
<td> text1 <a> link </a> text2 </td>
Run Code Online (Sandbox Code Playgroud)
但是当我调用element.text时,我只得到text1(它必须在那里,当我在FireBug中检查我的查询时,元素的文本被突出显示,嵌入的锚元素之前和之后的文本......
我试图使用Python将多个XML文件合并在一起,而不是外部库.XML文件具有嵌套元素.
示例文件1:
<root>
<element1>textA</element1>
<elements>
<nested1>text now</nested1>
</elements>
</root>
Run Code Online (Sandbox Code Playgroud)
示例文件2:
<root>
<element2>textB</element2>
<elements>
<nested1>text after</nested1>
<nested2>new text</nested2>
</elements>
</root>
Run Code Online (Sandbox Code Playgroud)
我想要的是:
<root>
<element1>textA</element1>
<element2>textB</element2>
<elements>
<nested1>text after</nested1>
<nested2>new text</nested2>
</elements>
</root>
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
从这个答案.
from xml.etree import ElementTree as et
def combine_xml(files):
first = None
for filename in files:
data = et.parse(filename).getroot()
if first is None:
first = data
else:
first.extend(data)
if first is not None:
return et.tostring(first)
Run Code Online (Sandbox Code Playgroud)
我得到了什么:
<root>
<element1>textA</element1>
<elements>
<nested1>text now</nested1>
</elements>
<element2>textB</element2>
<elements>
<nested1>text after</nested1>
<nested2>new …Run Code Online (Sandbox Code Playgroud) elementtree ×10
python ×10
xml ×9
lxml ×3
python-3.x ×2
doctype ×1
namespaces ×1
prefix ×1
python-2.6 ×1
python-2.7 ×1
xml.etree ×1