programing

xml.etree를 사용하여 XML 선언을 작성하는 방법요소나무

bestprogram 2023. 10. 24. 21:30

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 헤더를 얻을있습니다.

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