XML을 생성하는 가장 좋은 방법은 무엇입니까?
이 질문에 이미 답변이 있습니다.
- Python 7 답변을 사용하여 간단한 XML 파일 만들기
저는 웹 API를 만들고 있으며 잘 형식화 된 xml을 매우 빠르게 생성 할 수있는 좋은 방법이 필요합니다. 파이썬에서 이것을하는 좋은 방법을 찾을 수 없습니다.
참고 : 일부 라이브러리는 유망 해 보이지만 문서가 없거나 파일로만 출력됩니다.
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>
자세한 내용은 튜토리얼 을 참조하십시오.
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>
복잡한 형식을 위해 string.Template 또는 일부 템플릿 엔진도 사용할 수 있습니다.
yattag 라이브러리를 사용합니다 . 나는 그것이 가장 비단뱀적인 방법이라고 생각합니다.
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())
http://lxml.de/tutorial.html#the-e-factory 에서 lxml.builder 클래스를 사용 하십시오.
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 는 대부분의 경우에 좋지만 CData 및 pretty print 할 수 없습니다.
따라서 CData 와 예쁜 인쇄 가 필요하면 minidom 을 사용해야합니다 .
minidom_example.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_example.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>
I've tried a some of the solutions in this thread, and unfortunately, I found some of them to be cumbersome (i.e. requiring excessive effort when doing something non-trivial) and inelegant. Consequently, I thought I'd throw my preferred solution, web2py HTML helper objects, into the mix.
First, install the the standalone web2py module:
pip install web2py
Unfortunately, the above installs an extremely antiquated version of web2py, but it'll be good enough for this example. The updated source is here.
Import web2py HTML helper objects documented here.
from gluon.html import *
Now, you can use web2py helpers to generate 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
'Development Tip' 카테고리의 다른 글
iOS에서 자바 스크립트를 사용하여 클립 보드에 복사 (0) | 2020.11.12 |
---|---|
npm 오류! (0) | 2020.11.12 |
캡슐화 및 추상화를 이해하는 간단한 방법 (0) | 2020.11.12 |
C #에서 DateTime이 DateRange 사이에 있는지 확인하는 방법 (0) | 2020.11.12 |
PHP로 다음날 및 전날 받기 (0) | 2020.11.12 |