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
의 논쟁..write
function, 그래서 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 |