我正在尝试对xml文件进行可变性研究。示例伪代码如下所示。
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<currency>1.21$/kg</currency>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<currency>4.1$/kg</currency>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
我想动态地改变(比如乘以1.5)xml中的每个文本,这些文本都是数值,例如大于2&LT;或>&gt; 141100&lt;或者不是> 1.21 $ / kg&lt;或&gt;&gt; 4.1 $ / kg&lt;&lt ;.我需要将每个文本变体保存为不同的xml文件(例如,当我将列支敦士登的排名更改为3时,将xml文件另存为LiechtensteinRank1.5。)
我的目标是转换每个文本输入并保存每个更改的所有版本,然后再批量运行xml文件。 xml是相对较深的嵌套200,000行和最多10个不同的子节点。
我只能提取如下文字。
import xml.etree.ElementTree as ET
tree = ET.parse("Ywepr.xml")
root = tree.getroot()
for text in root.itertext():
print repr(text)
charlie = file.writelines(root.itertext())
欢迎所有建议。感谢
答案 0 :(得分:0)
在我看来,你需要对树进行遍历才能做到这一点。原因是您需要实际更新XML元素的文本,以使输出正确。
要遍历etree的节点,您需要使用Element.getchildren()。这将返回此元素的所有子元素的列表。因为英文描述非常粗糙,所以我只想启动代码。
def traversal(elem):
text = elem.text
# do work here
for node in elem.getchildren():
traversal(node)
这是树遍历的一种非常经典的递归解决方案,您可以逐节点地进行工作并访问所有子节点。最终,你最终都会访问它们。请注意,此解决方案要求您的XML数据适合内存,但似乎您已经加载了它,因此您应该在这里保持良好状态。
我还应该触摸你需要做什么来进行文本匹配。如果您的条件像“所有数字”一样简单,我建议使用正则表达式。以下应该足以让你开始,我希望。
import re
digitsRegex = re.compile(r'\d+$')
digitsRegex.match('12345')