天道酬勤,学无止境

elementtree

Python: ignoring namespaces in xml.etree.ElementTree?

How can I tell ElementTree to ignore namespaces in an XML file? For example, I would prefer to query modelVersion (as in statement 1) rather than {http://maven.apache.org/POM/4.0.0}modelVersion (as in statement 2). pom=""" <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> </project> """ from xml.etree import ElementTree ElementTree.register_namespace("","http://maven.apache.org/POM/4.0.0") root = ElementTree

2022-06-03 02:40:05    分类:问答    python   xml   elementtree

Retrieve all text of an element including its child in python

问题 我编写了一个代码来查找 xml 中特定标签中的文本。 它适用于没有子标签的标签。 For e.g. 1 <a>ajsaka</a>. it works fine for this. e.g. 2 But if there is an instance of <b>ahsjd<c>jjiij</c>aa</b>. 它不起作用。 我想要标签中的所有内容,包括其子元素文本。 我希望它打印 ahsjdjjiijaa,但它只打印 ahsjd。 到目前为止,这是我的代码。 这是输入文件。 <level> <ex> <nt>[edit <topic-ref link-text="short-title" topic-id="13629">address</topic-ref>],</nt> <nt>[edit routing-instances <var>routing-instance-name</var > <topic-ref link-text="short-title" topic-id="13629">address- assignment</topic-ref >]</nt> </ex> <exam> </exam> </level> from lxml import etree doc=etree.parse('C:/xx/bb.xml') root=doc.getroot

2022-05-17 05:27:38    分类:技术分享    xml   python-3.x   elementtree   xml.etree

ElementTree Remove Element

问题 Python 菜鸟在这里。 想知道删除所有updated属性值为true的“ profile ”标签的最干净和最好的方法是什么。 我尝试了以下代码,但它正在抛出: SyntaxError("cannot use absolute path on element") root.remove(root.findall("//Profile[@updated='true']")) XML: <parent> <child type="First"> <profile updated="true"> <other> </other> </profile> </child> <child type="Second"> <profile updated="true"> <other> </other> </profile> </child> <child type="Third"> <profile> <other> </other> </profile> </child> </parent> 回答1 如果您使用xml.etree.ElementTree ,则应使用 remove() 方法删除节点,但这需要您具有父节点引用。 因此,解决方案: import xml.etree.ElementTree as ET data = """ <parent> <child type="First

2022-05-14 23:46:27    分类:技术分享    python   xml   python-2.7   scripting   elementtree

Adding a parent tag to a nested structure with ElementTree (Python)

问题 I have the following structure <root> <data> <config> CONFIGURATION <config> </data> </root> 使用 Python 的 ElementTree 模块,我想将父元素添加到<config>标记为 <root> <data> <type> <config> CONFIGURATION <config> </type> </data> </root> 此外,xml 文件可能在其他地方有其他配置标签,但我只对出现在数据标签下的那些感兴趣。 回答1 这归结为〜3个步骤: 获取符合您的条件的元素(标签 == x,父标签 == y) 从父元素中删除该元素,在该位置放置一个新子元素将前一个孩子添加到新孩子。 第一步,我们可以使用这个答案。 既然我们知道我们稍后会需要父母,让我们在搜索中也保留它。 def find_elements(tree, child_tag, parent_tag): parent_map = dict((c, p) for p in tree.iter() for c in p) for el in tree.iter(child_tag): parent = parent_map[el] if parent.tag == parent_tag: yield el, parent

2022-05-10 13:00:09    分类:技术分享    python   xml   elementtree

How to solve TypeError: cannot serialize float Python Elementtree

问题 我有一个调试问题。 由于我在这里很新,请原谅可能出现的文字墙。 几个小时后,我终于让elementtree做我想做的事,但我无法输出我的结果,因为 tree.write("output3.xml") 也 print(ET.tostring(root)) 给我 TypeError:无法序列化 0.029999999999999999(float64 类型) 我不知道你们需要什么来帮助我,所有的源代码都很长。 错误信息也是如此。 但这有点容易,所以我把它贴在这里...... 提前注意: 据我所见,Ctrl+FI 在我的数据中没有那个 0.029999999... 我的数据中的所有数字都四舍五入到小数点后两位顺便说一句,四舍五入会改变什么吗? 还是只是为了展示? 我对此感到非常困惑,特别是因为似乎没有可通过谷歌搜索的类似案例,只有几乎但不是完全足够的案例。 -------------------------------------------------- ------------------------- TypeError Traceback (最近一次调用最后一次) in () ----> 1 tree.write("output3.xml ") C:\Anaconda\lib\xml\etree\ElementTree.pyc in write(self, file_or

2022-05-09 02:57:27    分类:技术分享    python   serialization   pandas   elementtree   marytts

Python ElementTree: How to add SubElement at VERY specific position?

问题 我想在 xml 文件中添加一个子元素,但在一个非常特定的位置,而不是附加到末尾。 标准方法是: subi = ET.SubElement(root[0][0], 'subi') 这很好。 但是:假设 root[0][0] 已经有两个孩子,因此可以通过 root[0][0][0] 和 root[0][0][1] 访问。 我想让“subi”成为新的中间孩子,root[0][0][1],使原来的第二个孩子成为第三个孩子root[0][0][2]。 有没有办法做到这一点? (我对生活和自然的体验会拒绝,但我对 python 寄予厚望=) 回答1 您可以使用 Element.insert 方法。 它允许您指定索引。 例如,要在第三个(索引:2)元素之前插入: >>> import xml.etree.ElementTree as ET >>> >>> root = ET.fromstring(''' ... <root> ... <first></first> ... <second></second> ... <third></third> ... </root> ... ''') >>> >>> new = ET.Element('new') >>> root.insert(2, new) # <----------- >>> print(ET.tostring(root))

2022-05-09 02:46:35    分类:技术分享    python   xml   elementtree

How do I wrap the contents of a SubElement in an XML tag in Python 3?

问题 我有一个这样的示例 xml 文件: <root> She <opt>went</opt> <opt>didn't go</opt> to school. </root> 我想创建一个名为 of 的子元素,并将 的所有内容放入其中。 那是, <root> <sentence> She <opt>went</opt> <opt>didn't go</opt> to school. </sentence> </root> 我知道用 ElementTree 或 lxml 制作子元素很热门,但我不知道如何从“She”到“shools”进行选择。 一次全部。 import lxml.etree as ET ET.SubElement(root, 'sentence') I'm lost... 回答1 import lxml.etree as ET content = '''\ <root> She <opt>went</opt> <opt>didn't go</opt> to school. </root>''' root = ET.fromstring(content) root.tag = 'sentence' newroot = ET.Element('root') newroot.insert(0,root) print(ET.tostring(newroot)) # <root

2022-05-04 22:01:04    分类:技术分享    python   lxml   elementtree

Get Xpath dynamically using ElementTree getpath()

问题 我需要编写一个动态函数,通过动态构建元素的 XPath,在 ATOM xml 的子树上查找元素。 为此,我写了这样的东西: tree = etree.parse(xmlFileUrl) e = etree.XPathEvaluator(tree, namespaces={'def':'http://www.w3.org/2005/Atom'}) entries = e('//def:entry') for entry in entries: mypath = tree.getpath(entry) + "/category" category = e(mypath) 上面的代码找不到“类别”,因为 getpath() 返回一个没有命名空间的 XPath,而 XPathEvaluator e() 需要命名空间。 虽然我知道我可以使用路径并在对 XPathEvaluator 的调用中提供命名空间,但我想知道是否可以使用所有命名空间使 getpath() 返回“完全限定”路径,因为这在某些情况下很方便案例。 (这是我之前的问题的衍生问题:没有命名空间的 Python XpathEvaluator) 回答1 基本上,使用标准 Python 的 xml.etree 库,需要一个不同的访问函数。 为了达到这个范围,您可以构建一个修改版本的iter方法,如下所示: def etree

2022-05-04 11:40:19    分类:技术分享    python   xpath   lxml   elementtree

Converting my python script from lxml to xml.etree

问题 我正在尝试将我的脚本(https://github.com/fletchermoore/n2c2)转换为使用默认包 xml.etree 而不是 lxml。 这是我的疏忽,但现在我意识到让我的目标受众在他们的 Mac 上设置 lxml 是不可能的。 我认为大多数代码应该只通过切换导入来工作,但是当我尝试它时,我发现 xml.etree 以不同的方式处理命名空间(我不明白)。 具体来说,在这里转换 setTagNames 函数的最简单方法是什么。 xml是从.fromstring()方法创建的。 def setTagNames(self, xml): officens = xml.nsmap['office'] textns = xml.nsmap['text'] drawns = xml.nsmap['draw'] xlinkns = xml.nsmap['xlink'] stylens = xml.nsmap['style'] fons = xml.nsmap['fo'] names = {} names['body'] = '{%s}body' % officens names['text'] = '{%s}text' % officens names['auto-styles'] = '{%s}automatic-styles' % officens names[

2022-05-04 10:12:04    分类:技术分享    python   lxml   odf   elementtree

Alter namespace prefixing with ElementTree in Python

问题 默认情况下,当您调用 ElementTree.parse(someXMLfile) 时,Python ElementTree 库会在每个解析的节点前面加上 Clark 表示法中的命名空间 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: ... 如何让它改变前缀行为以及函数结束时返回的正确内容是什么? 回答1 您不需要特别使用iterparse 。 相反,以下脚本: from cStringIO import StringIO import xml.etree.ElementTree as ET NS_MAP = { 'http://www.red-dove.com/ns

2022-05-04 04:56:20    分类:技术分享    python   xml   namespaces   elementtree