标签: elementtree

使用Python中的ElementTree更改名称空间前缀

默认情况下,当您调用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 xml namespaces elementtree

18
推荐指数
1
解决办法
9590
查看次数

有没有办法从ElementTree元素获取行号

所以我使用Python 3.2.1的cElementTree解析一些XML文件,在解析过程中我发现有些标签缺少属性信息.我想知道是否有任何简单的方法来获取xml文件中这些元素的行号.

python xml elementtree python-3.x

16
推荐指数
2
解决办法
7910
查看次数

ElementTree在Python2.6中的iter()等价物

我有这个代码与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()?

python xml elementtree python-2.6

15
推荐指数
2
解决办法
2万
查看次数

Python:忽略elementtree.ElementTree中的xmlns

有没有办法忽略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 xml elementtree xml-namespaces

15
推荐指数
1
解决办法
7289
查看次数

Python ElementTree解析未绑定的前缀错误

我在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文件?

python xml prefix elementtree

15
推荐指数
1
解决办法
1万
查看次数

使用(X)HTML实体解析XML

尝试使用ElementTree解析包含未定义实体(即&nbsp;)的XML :

ParseError: undefined entity &nbsp;

在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中那样进行更新.

python xml elementtree python-3.x

15
推荐指数
1
解决办法
8165
查看次数

如何在python中找到元素树中的元素数量?

我是元素树的新手,在这里我试图找到元素树中的元素数量.

from lxml import etree 
root = etree.parse(open("file.xml",'r'))
Run Code Online (Sandbox Code Playgroud)

有没有办法找到root中元素的总数?

python xml lxml elementtree

15
推荐指数
3
解决办法
2万
查看次数

使用lxml的etree创建doctype

我想在我使用LXML的etree生成的XML文档中添加doctypes.

但是我无法弄清楚如何添加doctype.硬编码和连接字符串不是一种选择.

我期待着在etree中添加PI的方式:

pi = etree.PI(...)
doc.addprevious(pi)
Run Code Online (Sandbox Code Playgroud)

但这对我不起作用.如何使用lxml添加到xml文档?

python doctype lxml elementtree

14
推荐指数
3
解决办法
1万
查看次数

lxml.etree,element.text不返回元素的整个文本

我通过xpath废弃了一些html,然后我转换成了etree.与此类似的东西:

<td> text1 <a> link </a> text2 </td>
Run Code Online (Sandbox Code Playgroud)

但是当我调用element.text时,我只得到text1(它必须在那里,当我在FireBug中检查我的查询时,元素的文本被突出显示,嵌入的锚元素之前和之后的文本......

python xml lxml elementtree xml.etree

14
推荐指数
4
解决办法
1万
查看次数

使用没有外部库的嵌套元素合并xml文件

我试图使用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)

python xml elementtree python-2.7

14
推荐指数
1
解决办法
2万
查看次数