【问题标题】:Read and Write special characters in XML with minidom用 minidom 读写 XML 中的特殊字符
【发布时间】:2015-04-01 01:51:57
【问题描述】:

我正在尝试在称为 objects 的元素中写和读回一组字符串,它具有两个属性 name(简单字符串)和 body,主体是带有特殊字符“\n”和“\ " 我正在使用以下代码来编写 xml 文件:

from xml.dom.minidom import Document

doc = Document()
root = doc.createElement('data')
doc.appendChild(root)
#create a scene
scene = doc.createElement('scene')
root.appendChild(scene)
#add object element
object = doc.createElement('object')
object.setAttribute('name', 'obj1')

txt= 'Text\nsome text\nanother one\\and so on\n'
object.setAttribute('body',txt )
scene.appendChild(object)

#write to a file
file_handle = open("filename.xml","wb")
file_handle.write(bytes(doc.toprettyxml(indent='\t'), 'UTF-8'))
file_handle.close()

它会生成这个文件

<?xml version="1.0" ?>
<data>
    <scene>
        <object body="Text
some text
another one\and so on
" name="obj1"/>
    </scene>
</data>

用于解析:

filepath = 'file.xml'
dom = minidom.parse(filepath)
scenes =dom.getElementsByTagName('scene')
for scene in scenes:
    txt_objs =scene.getElementsByTagName('object')
    for obj in txt_objs:
        obj_name = obj.getAttribute('name')
        obj_body = obj.getAttribute('body')
        print(obj_name,"  ",obj_body)

解析器的输出与存储的换行特殊字符不一样丢失,我如何保持与输入相同的输出

#parser output
obj1    Text some text another one\and so on

存储和检索带有特殊字符的字符串的正确方法是什么?

【问题讨论】:

  • 看看lxml。上手非常简单,在各个方面都可以省很多力。
  • @MauroBaraldi 感谢您的建议,但我不能使用外部库,此脚本适用于 blender_3d,所以我只需要使用默认情况下包含在 python 中的内容

标签: python xml special-characters minidom


【解决方案1】:

minidom 所展示的行为与W3C recommendation 一致。请参阅以下讨论:“Are line breaks in XML attribute values valid?”。我在这里引用了@JanCetkovsky 的答案以便于参考:

这是有效的,但是根据 W3C 的建议,您的 XML 解析器应该将所有空白字符标准化为空格 (0x20) - 因此您的示例的输出会有所不同(您应该在输出中添加新行“ ",但在第一种情况下只有空格)。[Source]

如果您可以控制 XML 文档结构(似乎您可以自己构建 XML),请将文本作为 XML 元素值而不是 XML 属性值:

.....
#add object element
obj = doc.createElement('object')
obj.setAttribute('name', 'obj1')

txt = 'Text\nsome text\nanother one\\and so on\n'
txt_node = doc.createTextNode(txt)
obj.appendChild(txt_node)
scene.appendChild(obj)
.....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 2012-04-24
    • 1970-01-01
    • 2013-12-09
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多