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 도우미 객체를 혼합물에 집어넣어야겠다고 생각했습니다.
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
'programing' 카테고리의 다른 글
문자 배열의 리터럴 문자열 이니셜라이저 (0) | 2023.09.17 |
---|---|
Android에서 모서리가 둥근 사용자 지정 대화 상자를 만드는 방법 (0) | 2023.09.17 |
좌 조인 ON 조건 및 기타 조건 구문을 사용하여 독트린에서 (0) | 2023.09.17 |
여러 개의 ajax 호출이 마지막 호출이 로드될 때까지 기다린 다음 실행 (0) | 2023.09.17 |
Chrome이 디버그 모드로 전환되지 않도록 하려면 어떻게 해야 합니까? (0) | 2023.09.12 |