Я использую lxml, пытаясь вывести следующий 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> 

Это мой код, но вывод неверен:

from lxml import etree
with open('student.txt', 'r') as f:
    data = f.read()
root = etree.Element("root")
child1 = etree.SubElement(root, "students" )
child1.addprevious(etree.Comment('学生信息表 \n "id" : [名字, 数学, 语文, 英文]'))
child1.text = str(data)

# write to file:
tree = etree.ElementTree(root)
tree.write('student.xml', pretty_print=True, xml_declaration=True, encoding='utf-8')

Выходной xml выглядит так: комментарий отсутствует в элементе <students>:

<?xml version='1.0' encoding='UTF-8'?>
<root>
    <!--学生信息表 
   "id" : [名字, 数学, 语文, 英文]-->
    <students>{
        "1":["张三",150,120,100],
        "2":["李四",90,99,95],
        "3":["王五",60,66,68]
        }
    </students>
</root>

Пожалуйста, помогите мне понять, что я делаю неправильно и как действовать дальше.

1
Dogs He 20 Ноя 2020 в 09:43

2 ответа

Лучший ответ

Попробуйте так:

students = """<?xml version="1.0" encoding="UTF-8"?>
<root>
    <students>        
        </students>
    </root> """

student_txt = """{ "1" : ["张三", 150, 120, 100], "2" : ["李四", 90, 99, 95], "3" : ["王五", 60, 66, 68]} """
    
from lxml import etree
doc = etree.XML(students.encode())

destination = doc.xpath('//students')[0]
destination.text=''    
new_comment = etree.Comment(student_txt)    
new_comment.tail = "\n"+student_txt

destination.insert(0, new_comment)
print(etree.tostring(doc).decode())

Выход:

<root>
    <students><!--{ "1" : ["张三", 150, 120, 100], "2" : ["李四", 90, 99, 95], "3" : ["王五", 60, 66, 68]} -->
{ "1" : ["张三", 150, 120, 100], "2" : ["李四", 90, 99, 95], "3" : ["王五", 60, 66, 68]} </students>
</root>
0
Jack Fleeting 21 Ноя 2020 в 13:36

Вместо использования addprevious() вы должны использовать вставку следующим образом:

child1.insert(0, etree.Comment('学生信息表 \n "id" : [名字, 数学, 语文, 英文]'))
0
Antoine Dubuis 20 Ноя 2020 в 08:53