xml.etree를 사용하여 XML 선언을 작성하는 방법요소나무
나는 파이썬에서 를 사용하여 XML 문서를 생성하고 있지만,tostring함수는 평문으로 변환할 때 XML 선언을 포함하지 않습니다.
from xml.etree.ElementTree import Element, tostring
document = Element('outer')
node = SubElement(document, 'inner')
node.NewValue = 1
print tostring(document) # Outputs "<outer><inner /></outer>"
다음 XML 선언을 포함하려면 문자열이 필요합니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
그러나 이를 수행하는 어떠한 문서화된 방법도 없는 것 같습니다.
XML 선언을 렌더링하기 위한 적절한 방법이 있습니까?ElementTree?
나는 그것에 대한 방법이 없는 것을 발견한 것에 놀랬습니다.ElementTree.tostring(). 그러나 사용할 수 있습니다.ElementTree.ElementTree.write()XML 문서를 가짜 파일에 쓰는 방법:
from io import BytesIO
from xml.etree import ElementTree as ET
document = ET.Element('outer')
node = ET.SubElement(document, 'inner')
et = ET.ElementTree(document)
f = BytesIO()
et.write(f, encoding='utf-8', xml_declaration=True)
print(f.getvalue()) # your XML file, encoded as UTF-8
이 질문을 보세요.그 때도 '독립형' 속성은 스스로 붙여서 쓰지 않고는 얻을 수 없다고 생각합니다.
lxml을 사용합니다(http://lxml.de/api.html) 참조).
그러면 다음을 수행할 수 있습니다.
from lxml import etree
document = etree.Element('outer')
node = etree.SubElement(document, 'inner')
print(etree.tostring(document, xml_declaration=True))
xml.etree.ElementTree.tostring은 encoding='utf8'을 사용하여 XML 인코딩 선언을 씁니다.
샘플 파이썬 코드(파이썬 2 및 3과 함께 작동):
import xml.etree.ElementTree as ElementTree
tree = ElementTree.ElementTree(
ElementTree.fromstring('<xml><test>123</test></xml>')
)
root = tree.getroot()
print('without:')
print(ElementTree.tostring(root, method='xml'))
print('')
print('with:')
print(ElementTree.tostring(root, encoding='utf8', method='xml'))
Python 2 출력:
$ python2 example.py
without:
<xml><test>123</test></xml>
with:
<?xml version='1.0' encoding='utf8'?>
<xml><test>123</test></xml>
파이썬 3의 경우 바이트 리터럴이 반환됨을 나타내는 접두사(Python 2의 경우와 마찬가지로)가 표시됩니다.
$ python3 example.py
without:
b'<xml><test>123</test></xml>'
with:
b"<?xml version='1.0' encoding='utf8'?>\n<xml><test>123</test></xml>"
xml_declaration 인수
ElementTree에서 XML 선언을 렌더링하는 적절한 방법이 있습니까?
예, 그리고 사용할 필요가 없습니다..tostring기능.요소에 따라트리 설명서, 요소를 작성해야 합니다.트리 개체, Element and SubElements 만들기, 트리의 루트 설정, 그리고 마지막으로 사용xml_declaration의 논쟁..writefunction, 그래서 declaration line은 출력 파일에 포함됩니다.
이렇게 할 수 있습니다.
import xml.etree.ElementTree as ET
tree = ET.ElementTree("tree")
document = ET.Element("outer")
node1 = ET.SubElement(document, "inner")
node1.text = "text"
tree._setroot(document)
tree.write("./output.xml", encoding = "UTF-8", xml_declaration = True)
출력 파일은 다음과 같습니다.
<?xml version='1.0' encoding='UTF-8'?>
<outer><inner>text</inner></outer>
최근에 이 문제가 발생했는데, 코드를 좀 파헤친 후에 다음 코드 조각이 함수의 정의라는 것을 알게 되었습니다.ElementTree.write
def write(self, file, encoding="us-ascii"):
assert self._root is not None
if not hasattr(file, "write"):
file = open(file, "wb")
if not encoding:
encoding = "us-ascii"
elif encoding != "utf-8" and encoding != "us-ascii":
file.write("<?xml version='1.0' encoding='%s'?>\n" %
encoding)
self._write(file, self._root, encoding, {})
그래서 답은 만약 당신이 XML 헤더를 당신의 파일에 쓸 필요가 있다면, 설정하는 것입니다.encoding이외의 논쟁utf-8아니면us-ascii,예.UTF-8
만만하다
Python 2와 3에 대한 샘플(인코딩 매개 변수는 utf8이어야 함):
import xml.etree.ElementTree as ElementTree
tree = ElementTree.ElementTree(ElementTree.fromstring('<xml><test>123</test></xml>'))
root = tree.getroot()
print(ElementTree.tostring(root, encoding='utf8', method='xml'))
Python 3.8부터는 xml_declaration 매개 변수가 있습니다.
버전 3.8의 새로운 기능: xml_declaration 및 default_namespace 매개 변수입니다.
xml.etree.ElementTree.tostring(element, encoding="us-ascii", method="xml", *, xml_declaration=none, default_namespace=none, short_empty_elements=True) 모든 하위 요소를 포함하는 XML 요소의 문자열 표현을 생성합니다.element는 Element 인스턴스입니다.encoding 1은 출력 encoding(기본값은 US-ASCII).encoding=" unicode"를 사용하여 유니코드 문자열을 생성합니다(otherwise, 바이트 문자열이 생성됨).메서드는 "xml", "html" 또는 "text"입니다(기본값은 "xml"입니다).xml_declaration, default_namespace 및 short_empty_elements의 의미는 ElementTree와 동일합니다.글을 쓰다XML 데이터가 들어 있는 (선택적으로) 인코딩된 문자열을 반환합니다.
Python 3.8 이상용 샘플:
import xml.etree.ElementTree as ElementTree
tree = ElementTree.ElementTree(ElementTree.fromstring('<xml><test>123</test></xml>'))
root = tree.getroot()
print(ElementTree.tostring(root, encoding='unicode', method='xml', xml_declaration=True))
다음과 같은 최소 작동 예제ElementTree패키지 사용량:
import xml.etree.ElementTree as ET
document = ET.Element('outer')
node = ET.SubElement(document, 'inner')
node.text = '1'
res = ET.tostring(document, encoding='utf8', method='xml').decode()
print(res)
출력은 다음과 같습니다.
<?xml version='1.0' encoding='utf8'?>
<outer><inner>1</inner></outer>
또 다른 꽤 간단한 옵션은 원하는 헤더를 다음과 같이 xml 문자열에 연결하는 것입니다.
xml = (bytes('<?xml version="1.0" encoding="UTF-8"?>\n', encoding='utf-8') + ET.tostring(root))
xml = xml.decode('utf-8')
with open('invoice.xml', 'w+') as f:
f.write(xml)
ET를 사용합니다.
try:
from lxml import etree
print("running with lxml.etree")
except ImportError:
try:
# Python 2.5
import xml.etree.cElementTree as etree
print("running with cElementTree on Python 2.5+")
except ImportError:
try:
# Python 2.5
import xml.etree.ElementTree as etree
print("running with ElementTree on Python 2.5+")
except ImportError:
try:
# normal cElementTree install
import cElementTree as etree
print("running with cElementTree")
except ImportError:
try:
# normal ElementTree install
import elementtree.ElementTree as etree
print("running with ElementTree")
except ImportError:
print("Failed to import ElementTree from any known place")
document = etree.Element('outer')
node = etree.SubElement(document, 'inner')
print(etree.tostring(document, encoding='UTF-8', xml_declaration=True))
이것은 인쇄만 하고자 할 때 효과가 있습니다.파일로 보내려고 할 때 오류가 발생하는...
import xml.dom.minidom as minidom
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element, SubElement, Comment, tostring
def prettify(elem):
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
선언문에 '독립 실행형' 포함
추가할 수 있는 대안을 찾지 못했습니다.standalone문서에서 논쟁을 해서 나는 그것을 각색했습니다.ET.tosting그것을 논쟁으로 받아들이는 함수.
from xml.etree import ElementTree as ET
# Sample
document = ET.Element('outer')
node = ET.SubElement(document, 'inner')
et = ET.ElementTree(document)
# Function that you need
def tostring(element, declaration, encoding=None, method=None,):
class dummy:
pass
data = []
data.append(declaration+"\n")
file = dummy()
file.write = data.append
ET.ElementTree(element).write(file, encoding, method=method)
return "".join(data)
# Working example
xdec = """<?xml version="1.0" encoding="UTF-8" standalone="no" ?>"""
xml = tostring(document, encoding='utf-8', declaration=xdec)
언급URL : https://stackoverflow.com/questions/15356641/how-to-write-xml-declaration-using-xml-etree-elementtree
'programing' 카테고리의 다른 글
| "IIS Express 웹 서버를 시작할 수 없습니다" 오류 (0) | 2023.10.24 |
|---|---|
| 비AJAX jQuery POST 요청 (0) | 2023.10.24 |
| jquery select 옵션 클릭 처리기 (0) | 2023.10.24 |
| 구조물의 크기를 확인하려면 어떻게 해야 합니까? (0) | 2023.10.24 |
| 워드프레스 아이디로 발췌하기 (0) | 2023.10.24 |