programing

xml을 생성하는 가장 좋은 방법은?

css3 2023. 9. 17. 13:24

xml을 생성하는 가장 좋은 방법은?

웹 API를 만들고 있는데 잘 포맷된 xml을 매우 빠르게 생성할 수 있는 좋은 방법이 필요합니다.파이썬에서 이것을 할 수 있는 좋은 방법을 찾을 수 없습니다.

참고: 일부 라이브러리는 유망해 보이지만 설명서가 부족하거나 파일에 대한 출력만 가능합니다.

ElementTree는 xml을 읽고 쓰기에 좋은 모듈입니다.

from xml.etree.ElementTree import Element, SubElement, tostring

root = Element('root')
child = SubElement(root, "child")
child.text = "I am a child"

print(tostring(root))

출력:

<root><child>I am a child</child></root>

자세한 내용과 예쁘게 인쇄하는 방법은 자습서를 참조하십시오.

또는 XML이 단순한 경우 문자열 형식의 성능을 과소평가하지 마십시오. :)

xmlTemplate = """<root>
    <person>
        <name>%(name)s</name>
        <address>%(address)s</address>
     </person>
</root>"""

data = {'name':'anurag', 'address':'Pune, india'}
print xmlTemplate%data

출력:

<root>
    <person>
        <name>anurag</name>
        <address>Pune, india</address>
     </person>
</root>

문자열을 사용할 수 있습니다.복잡한 형식을 위해 템플릿이나 템플릿 엔진도 있습니다.

lxml 사용:

from lxml import etree

# create XML 
root = etree.Element('root')
root.append(etree.Element('child'))
# another child with text
child = etree.Element('child')
child.text = 'some text'
root.append(child)

# pretty string
s = etree.tostring(root, pretty_print=True)
print s

출력:

<root>
  <child/>
  <child>some text</child>
</root>

자세한 내용은 자습서를 참조하십시오.

저는 야태그 도서관을 이용할 것입니다.

from yattag import Doc

doc, tag, text = Doc().tagtext()

with tag('food'):
    with tag('name'):
        text('French Breakfast')
    with tag('price', currency='USD'):
        text('6.95')
    with tag('ingredients'):
        for ingredient in ('baguettes', 'jam', 'butter', 'croissants'):
            with tag('ingredient'):
                text(ingredient)
    

print(doc.getvalue())

참고로 저는 도서관의 저자입니다.

lxml을 사용합니다.Builder 클래스, 출처: http://lxml.de/tutorial.html#the-e-factory

import lxml.builder as lb
from lxml import etree

nstext = "new story"
story = lb.E.Asset(
  lb.E.Attribute(nstext, name="Name", act="set"),
  lb.E.Relation(lb.E.Asset(idref="Scope:767"),
            name="Scope", act="set")
  )

print 'story:\n', etree.tostring(story, pretty_print=True)

출력:

story:
<Asset>
  <Attribute name="Name" act="set">new story</Attribute>
  <Relation name="Scope" act="set">
    <Asset idref="Scope:767"/>
  </Relation>
</Asset>

순수 Python을 사용할 경우 선택할 수 있는 방법:

ElementTree는 대부분의 경우에 적합하지만, 데이터를 CD화할 수 없고 인쇄도 예쁘게 할 수 없습니다.

따라서 CD 데이터와 예쁜 프린트가 필요하다면 미니돔을 사용해야 합니다.

미니돔의py:

from xml.dom import minidom

doc = minidom.Document()

root = doc.createElement('root')
doc.appendChild(root)

leaf = doc.createElement('leaf')
text = doc.createTextNode('Text element with attributes')
leaf.appendChild(text)
leaf.setAttribute('color', 'white')
root.appendChild(leaf)

leaf_cdata = doc.createElement('leaf_cdata')
cdata = doc.createCDATASection('<em>CData</em> can contain <strong>HTML tags</strong> without encoding')
leaf_cdata.appendChild(cdata)
root.appendChild(leaf_cdata)

branch = doc.createElement('branch')
branch.appendChild(leaf.cloneNode(True))
root.appendChild(branch)

mixed = doc.createElement('mixed')
mixed_leaf = leaf.cloneNode(True)
mixed_leaf.setAttribute('color', 'black')
mixed_leaf.setAttribute('state', 'modified')
mixed.appendChild(mixed_leaf)
mixed_text = doc.createTextNode('Do not use mixed elements if it possible.')
mixed.appendChild(mixed_text)
root.appendChild(mixed)

xml_str = doc.toprettyxml(indent="  ")
with open("minidom_example.xml", "w") as f:
    f.write(xml_str)

minidom_slots.xml:

<?xml version="1.0" ?>
<root>
  <leaf color="white">Text element with attributes</leaf>
  <leaf_cdata>
<![CDATA[<em>CData</em> can contain <strong>HTML tags</strong> without encoding]]>  </leaf_cdata>
  <branch>
    <leaf color="white">Text element with attributes</leaf>
  </branch>
  <mixed>
    <leaf color="black" state="modified">Text element with attributes</leaf>
    Do not use mixed elements if it possible.
  </mixed>
</root>

이 스레드에서 몇 가지 해결책을 시도해 보았는데 불행히도 몇 가지 해결책이 번거롭고(즉, 사소한 일을 할 때 과도한 노력이 필요함) 우아하지 않다는 것을 알게 되었습니다.그 결과, 저는 제가 선호하는 솔루션인 web2py HTML 도우미 객체를 혼합물에 집어넣어야겠다고 생각했습니다.

먼저 독립 실행형 web2py 모듈을 설치합니다.

pip install web2py

유감스럽게도, 위는 매우 구식 버전의 web2py를 설치하지만, 이 예에서는 충분할 것입니다.업데이트된 출처는 여기에 있습니다.

여기에 문서화된 web2py HTML 도우미 개체를 가져옵니다.

from gluon.html import *

이제 웹2py 도우미를 사용하여 XML/HTML을 생성할 수 있습니다.

words = ['this', 'is', 'my', 'item', 'list']
# helper function
create_item = lambda idx, word: LI(word, _id = 'item_%s' % idx, _class = 'item')
# create the HTML
items = [create_item(idx, word) for idx,word in enumerate(words)]
ul = UL(items, _id = 'my_item_list', _class = 'item_list')
my_div = DIV(ul, _class = 'container')

>>> my_div

<gluon.html.DIV object at 0x00000000039DEAC8>

>>> my_div.xml()
# I added the line breaks for clarity
<div class="container">
   <ul class="item_list" id="my_item_list">
      <li class="item" id="item_0">this</li>
      <li class="item" id="item_1">is</li>
      <li class="item" id="item_2">my</li>
      <li class="item" id="item_3">item</li>
      <li class="item" id="item_4">list</li>
   </ul>
</div>

언급URL : https://stackoverflow.com/questions/3844360/best-way-to-generate-xml