向元素添加注释并使元素文本出现在注释之后
Adding a comment to an element and making the element text appear after the comment
我想保存一个带有注释的 XML 文件,但即使我在添加文本之前添加了注释,注释也会出现在输出中的文本之后。我的代码和输出如下。
def save_xml(data):
root = etree.Element('root')
student_xml = etree.ElementTree(root)
student = etree.SubElement(root,'students')
student.append(etree.Comment('\n学生信息表\n\"id\": [名字,数学,语文,英语]\n'))
student.text = str(data)
file = open('student.xml', 'w',encoding='utf-8')
file.write(etree.tounicode(student_xml.getroot()))
file.close()
<root><students>{1: ['张三', 150, 120, 100], 2: ['李四', 90, 99, 95], 3: ['王 五', 60, 66, 68]}<!--
学生信息表
"id": [名字,数学,语文,英语]
--></students></root>
我想要如下所示的输出。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<students>
<!--
学生信息表
"id" : [名字, 数学, 语文, 英文]
-->
{
"1" : ["张三", 150, 120, 100],
"2" : ["李四", 90, 99, 95],
"3" : ["王五", 60, 66, 68]
}
</students>
</root>
添加文本作为评论节点的tail
。
student = etree.SubElement(root, 'students')
comment = etree.Comment('\n学生信息表\n\"id\": [名字,数学,语文,英语]\n')
comment.tail = "\n" + str(data)
student.append(comment)
tail
属性 包含紧跟在元素之后的文本(注释是一种特殊类型的元素节点)。
另见 https://lxml.de/tutorial.html#elements-contain-text and http://infohost.nmt.edu/~shipman/soft/pylxml/web/etree-view.html。
如果漂亮的打印很重要,您可以做几件事:
序列化使用pretty_print=True
.
使用pprint.pformat()
格式化data
字典。
在几个地方添加一些额外的空格。
完整示例:
from lxml import etree
from pprint import pformat
data = {
"1" : ["张三", 150, 120, 100],
"2" : ["李四", 90, 99, 95],
"3" : ["王五", 60, 66, 68]
}
root = etree.Element('root')
student = etree.SubElement(root, 'students')
student.text = "\n"
comment = etree.Comment('\n 学生信息表\n \"id\": [名字,数学,语文,英语]\n')
comment.tail = "\n" + pformat(data, width=35) + "\n"
student.append(comment)
etree.ElementTree(root).write("students.xml", pretty_print=True,
encoding="UTF-8", xml_declaration=True)
students.xml 的内容:
<?xml version='1.0' encoding='UTF-8'?>
<root>
<students>
<!--
学生信息表
"id": [名字,数学,语文,英语]
-->
{'1': ['张三', 150, 120, 100],
'2': ['李四', 90, 99, 95],
'3': ['王五', 60, 66, 68]}
</students>
</root>
我想保存一个带有注释的 XML 文件,但即使我在添加文本之前添加了注释,注释也会出现在输出中的文本之后。我的代码和输出如下。
def save_xml(data):
root = etree.Element('root')
student_xml = etree.ElementTree(root)
student = etree.SubElement(root,'students')
student.append(etree.Comment('\n学生信息表\n\"id\": [名字,数学,语文,英语]\n'))
student.text = str(data)
file = open('student.xml', 'w',encoding='utf-8')
file.write(etree.tounicode(student_xml.getroot()))
file.close()
<root><students>{1: ['张三', 150, 120, 100], 2: ['李四', 90, 99, 95], 3: ['王 五', 60, 66, 68]}<!--
学生信息表
"id": [名字,数学,语文,英语]
--></students></root>
我想要如下所示的输出。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<students>
<!--
学生信息表
"id" : [名字, 数学, 语文, 英文]
-->
{
"1" : ["张三", 150, 120, 100],
"2" : ["李四", 90, 99, 95],
"3" : ["王五", 60, 66, 68]
}
</students>
</root>
添加文本作为评论节点的tail
。
student = etree.SubElement(root, 'students')
comment = etree.Comment('\n学生信息表\n\"id\": [名字,数学,语文,英语]\n')
comment.tail = "\n" + str(data)
student.append(comment)
tail
属性 包含紧跟在元素之后的文本(注释是一种特殊类型的元素节点)。
另见 https://lxml.de/tutorial.html#elements-contain-text and http://infohost.nmt.edu/~shipman/soft/pylxml/web/etree-view.html。
如果漂亮的打印很重要,您可以做几件事:
序列化使用
pretty_print=True
.使用
pprint.pformat()
格式化data
字典。在几个地方添加一些额外的空格。
完整示例:
from lxml import etree
from pprint import pformat
data = {
"1" : ["张三", 150, 120, 100],
"2" : ["李四", 90, 99, 95],
"3" : ["王五", 60, 66, 68]
}
root = etree.Element('root')
student = etree.SubElement(root, 'students')
student.text = "\n"
comment = etree.Comment('\n 学生信息表\n \"id\": [名字,数学,语文,英语]\n')
comment.tail = "\n" + pformat(data, width=35) + "\n"
student.append(comment)
etree.ElementTree(root).write("students.xml", pretty_print=True,
encoding="UTF-8", xml_declaration=True)
students.xml 的内容:
<?xml version='1.0' encoding='UTF-8'?>
<root>
<students>
<!--
学生信息表
"id": [名字,数学,语文,英语]
-->
{'1': ['张三', 150, 120, 100],
'2': ['李四', 90, 99, 95],
'3': ['王五', 60, 66, 68]}
</students>
</root>