使用 python xml.etree 模块格式化插入的元素,以包含新行
Formatting inserted elements using python xml.etree module, to include new lines
我正在将单个元素插入到一个大 xml 文件中。我希望插入的元素位于顶部(因此我需要使用 root.insert 方法,而不能仅附加到文件)。我还希望元素的格式与文件的其余部分匹配。
原始 XML 文件的格式为
<a>
<b>
<c/>
</b>
<d>
<e/>
</d>
....
</a>
然后我运行下面的代码:
import xml.etree.ElementTree as ET
xmlfile = ET.parse('file.xml')
a = xmlfile.getroot()
f = ET.Element('f')
g = ET.SubElement(f,'g')
a.insert(1, f)
xmlfile.write('file.xml')
它以以下形式创建输出:
<a>
<b>
<c/>
</b>
<f><g/></f><d>
<e/>
</d>
....
</a>
但我希望采用以下形式:
<a>
<b>
<c/>
</b>
<f>
<g/>
</f>
<d>
<e/>
</d>
....
</a>
使用 Jonathan Eunice 解决问题“如何让 Python 的 ElementTree 漂亮地打印到 XML 文件?”我添加了以下代码来替换 xmlfile.write 命令:
from xml.dom import minidom
xmlstr = minidom.parseString(ET.tostring(a)).toprettyxml(indent=" ")
with open("New_Database.xml", "w") as f:
f.write(xmlstr)
但是整个文件的格式仍然不正确。它正确地格式化了新元素,但原始元素现在被隔开了:
<b>
<c/>
</b>
<f>
<g/>
</f>
<c>
<d/>
</c>
....
</a>
我认为这是因为 toprettyxml() 命令在 '\n' 分隔符处添加了一个新行(因此向当前格式添加了 2 个新行)。摆弄输入只会改变添加的元素或原始元素的格式是否不正确。我需要一种方法在添加新元素之前修改新元素或原始元素,以便它们的格式相同,然后我可以在打印前重新格式化所有元素吗?是否可以使用 'xml.etree.ElementTree' 添加格式?
提前致谢。
可以使用 text
and tail
属性对空格进行 fiddle。也许这对你来说已经足够了。请参阅下面的演示。
输入文档:
<a>
<b>
<c/>
</b>
<d>
<e/>
</d>
</a>
代码:
import xml.etree.ElementTree as ET
xmlfile = ET.parse('file.xml')
a = xmlfile.getroot()
f = ET.Element('f')
g = ET.SubElement(f,'g')
f.tail = "\n "
f.text = "\n "
g.tail = "\n "
a.insert(1, f)
print ET.tostring(a)
输出:
<a>
<b>
<c />
</b>
<f>
<g />
</f>
<d>
<e />
</d>
</a>
我正在将单个元素插入到一个大 xml 文件中。我希望插入的元素位于顶部(因此我需要使用 root.insert 方法,而不能仅附加到文件)。我还希望元素的格式与文件的其余部分匹配。
原始 XML 文件的格式为
<a>
<b>
<c/>
</b>
<d>
<e/>
</d>
....
</a>
然后我运行下面的代码:
import xml.etree.ElementTree as ET
xmlfile = ET.parse('file.xml')
a = xmlfile.getroot()
f = ET.Element('f')
g = ET.SubElement(f,'g')
a.insert(1, f)
xmlfile.write('file.xml')
它以以下形式创建输出:
<a>
<b>
<c/>
</b>
<f><g/></f><d>
<e/>
</d>
....
</a>
但我希望采用以下形式:
<a>
<b>
<c/>
</b>
<f>
<g/>
</f>
<d>
<e/>
</d>
....
</a>
使用 Jonathan Eunice 解决问题“如何让 Python 的 ElementTree 漂亮地打印到 XML 文件?”我添加了以下代码来替换 xmlfile.write 命令:
from xml.dom import minidom
xmlstr = minidom.parseString(ET.tostring(a)).toprettyxml(indent=" ")
with open("New_Database.xml", "w") as f:
f.write(xmlstr)
但是整个文件的格式仍然不正确。它正确地格式化了新元素,但原始元素现在被隔开了:
<b>
<c/>
</b>
<f>
<g/>
</f>
<c>
<d/>
</c>
....
</a>
我认为这是因为 toprettyxml() 命令在 '\n' 分隔符处添加了一个新行(因此向当前格式添加了 2 个新行)。摆弄输入只会改变添加的元素或原始元素的格式是否不正确。我需要一种方法在添加新元素之前修改新元素或原始元素,以便它们的格式相同,然后我可以在打印前重新格式化所有元素吗?是否可以使用 'xml.etree.ElementTree' 添加格式?
提前致谢。
可以使用 text
and tail
属性对空格进行 fiddle。也许这对你来说已经足够了。请参阅下面的演示。
输入文档:
<a>
<b>
<c/>
</b>
<d>
<e/>
</d>
</a>
代码:
import xml.etree.ElementTree as ET
xmlfile = ET.parse('file.xml')
a = xmlfile.getroot()
f = ET.Element('f')
g = ET.SubElement(f,'g')
f.tail = "\n "
f.text = "\n "
g.tail = "\n "
a.insert(1, f)
print ET.tostring(a)
输出:
<a>
<b>
<c />
</b>
<f>
<g />
</f>
<d>
<e />
</d>
</a>