向元素添加评论,并使元素文本显示在评论之后

时间:2018-07-20 07:06:38

标签: python xml lxml

我想保存带有注释的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>

1 个答案:

答案 0 :(得分:1)

将文本添加为​​评论节点的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-texthttp://infohost.nmt.edu/~shipman/soft/pylxml/web/etree-view.html


如果漂亮的打印很重要,那么您可以做一些事情:

  1. 使用pretty_print=True序列化。

  2. 使用pprint.pformat()格式化data字典。

  3. 在一些地方添加一些额外的空格。

完整示例:

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>