Репликация примера xml.etree в yattag - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь выбрать между использованием xml.etree и yattag.yattag, кажется, имеет более краткий синтаксис, но я не могу 100% воспроизвести этот xml.etree пример :

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))

, который возвращает

<?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 &quot;tail&quot; text.
  <child_with_entity_ref>This &amp; 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)

, который возвращает:

<?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 &amp; that
    </child_with_entity_ref>
</top>

Так что код yattag короче и проще (я думаю), но я не смог сработатькак:

  1. Автоматически добавлять тег версии XML при запуске (обходной путь doc.asis)
  2. Создать комментарий (обходной путь doc.asis)
  3. Побег " персонаж.xml.etree заменил его на &quot;
  4. Добавить хвостовой текст --- но я не уверен, зачем мне это нужно.

Мой вопрос: могу ли я сделатьвыше на 4 пункта лучше, чем я использовал yattag?

Примечание: я создаю XML для взаимодействия с этим API .

1 Ответ

0 голосов
/ 02 июня 2018

Для 1 и 2, doc.asis - лучший способ продолжить.

Для 3 вы должны использовать text('And "tail" text.') вместо asis.Это позволит избежать символов, которые должны быть экранированы.Обратите внимание, что символ " на самом деле не экранируется методом text.Это нормально." необходимо экранировать только в том случае, если он присутствует внутри атрибута xml или html, и вам не нужно экранировать его внутри текстового узла.Метод text экранирует символы, которые необходимо экранировать внутри текстового узла.Это символы &, <и>.(источник: http://www.yattag.org/#the-text-method)

Я не понял 4.

...