在 yattag 中复制 xml.etree 示例
Replicating xml.etree example in yattag
我正在尝试在使用 xml.etree
和 yattag
之间做出选择。 yattag
似乎有更简洁的语法,但我不能 100% 复制 this xml.etree
example:
from xml.etree.ElementTree import Element, SubElement, Comment, tostring
top = Element('top')
comment = Comment('Generated for PyMOTW')
top.append(comment)
child = SubElement(top, 'child')
child.text = 'This child contains text.'
child_with_tail = SubElement(top, 'child_with_tail')
child_with_tail.text = 'This child has regular text.'
child_with_tail.tail = 'And "tail" text.'
child_with_entity_ref = SubElement(top, 'child_with_entity_ref')
child_with_entity_ref.text = 'This & that'
print(tostring(top))
from xml.etree import ElementTree
from xml.dom import minidom
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ElementTree.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
print(prettify(top))
哪个returns
<?xml version="1.0" ?>
<top>
<!--Generated for PyMOTW-->
<child>This child contains text.</child>
<child_with_tail>This child has regular text.</child_with_tail>
And "tail" text.
<child_with_entity_ref>This & that</child_with_entity_ref>
</top>
我尝试使用 yattag
:
from yattag import Doc
from yattag import indent
doc, tag, text, line = Doc().ttl()
doc.asis('<?xml version="1.0" ?>')
with tag('top'):
doc.asis('<!--Generated for PyMOTW-->')
line('child', 'This child contains text.')
line('child_with_tail', 'This child has regular text.')
doc.asis('And "tail" text.')
line('child_with_entity_ref','This & that')
result = indent(
doc.getvalue(),
indentation = ' ',
newline = '\r\n',
indent_text = True
)
print(result)
哪个returns:
<?xml version="1.0" ?>
<top>
<!--Generated for PyMOTW-->
<child>
This child contains text.
</child>
<child_with_tail>
This child has regular text.
</child_with_tail>
And "tail" text.
<child_with_entity_ref>
This & that
</child_with_entity_ref>
</top>
所以 yattag
代码更短更简单(我认为),但我不知道如何:
- 在开头自动添加 XML 版本标签(解决方法是
doc.asis
)
- 创建评论(解决方法是
doc.asis
)
- 转义
"
字符。 xml.etree
替换为 "
- 添加尾部文本 --- 但我不确定为什么需要这个。
我的问题是我能比使用 yattag
更好地完成以上 4 点吗?
注意:我正在构建 XML 以与 this api 互动。
对于 1 和 2,doc.asis
是最好的方法。
对于 3 你应该使用 text('And "tail" text.')
而不是 asis
。这将转义需要转义的字符。但是请注意, "
字符实际上并未被 text
方法转义。
这个是正常的。 "
只有出现在 xml 或 html 属性中时才需要进行转义,而无需在文本节点中进行转义。
text
方法对文本节点内需要转义的字符进行转义。这些是 &、< 和 > 字符。 (来源:http://www.yattag.org/#the-text-method)
没看懂 4.
我正在尝试在使用 xml.etree
和 yattag
之间做出选择。 yattag
似乎有更简洁的语法,但我不能 100% 复制 this xml.etree
example:
from xml.etree.ElementTree import Element, SubElement, Comment, tostring
top = Element('top')
comment = Comment('Generated for PyMOTW')
top.append(comment)
child = SubElement(top, 'child')
child.text = 'This child contains text.'
child_with_tail = SubElement(top, 'child_with_tail')
child_with_tail.text = 'This child has regular text.'
child_with_tail.tail = 'And "tail" text.'
child_with_entity_ref = SubElement(top, 'child_with_entity_ref')
child_with_entity_ref.text = 'This & that'
print(tostring(top))
from xml.etree import ElementTree
from xml.dom import minidom
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ElementTree.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
print(prettify(top))
哪个returns
<?xml version="1.0" ?>
<top>
<!--Generated for PyMOTW-->
<child>This child contains text.</child>
<child_with_tail>This child has regular text.</child_with_tail>
And "tail" text.
<child_with_entity_ref>This & that</child_with_entity_ref>
</top>
我尝试使用 yattag
:
from yattag import Doc
from yattag import indent
doc, tag, text, line = Doc().ttl()
doc.asis('<?xml version="1.0" ?>')
with tag('top'):
doc.asis('<!--Generated for PyMOTW-->')
line('child', 'This child contains text.')
line('child_with_tail', 'This child has regular text.')
doc.asis('And "tail" text.')
line('child_with_entity_ref','This & that')
result = indent(
doc.getvalue(),
indentation = ' ',
newline = '\r\n',
indent_text = True
)
print(result)
哪个returns:
<?xml version="1.0" ?>
<top>
<!--Generated for PyMOTW-->
<child>
This child contains text.
</child>
<child_with_tail>
This child has regular text.
</child_with_tail>
And "tail" text.
<child_with_entity_ref>
This & that
</child_with_entity_ref>
</top>
所以 yattag
代码更短更简单(我认为),但我不知道如何:
- 在开头自动添加 XML 版本标签(解决方法是
doc.asis
) - 创建评论(解决方法是
doc.asis
) - 转义
"
字符。xml.etree
替换为"
- 添加尾部文本 --- 但我不确定为什么需要这个。
我的问题是我能比使用 yattag
更好地完成以上 4 点吗?
注意:我正在构建 XML 以与 this api 互动。
对于 1 和 2,doc.asis
是最好的方法。
对于 3 你应该使用 text('And "tail" text.')
而不是 asis
。这将转义需要转义的字符。但是请注意, "
字符实际上并未被 text
方法转义。
这个是正常的。 "
只有出现在 xml 或 html 属性中时才需要进行转义,而无需在文本节点中进行转义。
text
方法对文本节点内需要转义的字符进行转义。这些是 &、< 和 > 字符。 (来源:http://www.yattag.org/#the-text-method)
没看懂 4.