Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用XML.etree.ElementTree编写XML声明_Python_Xml_Elementtree - Fatal编程技术网

Python 如何使用XML.etree.ElementTree编写XML声明

Python 如何使用XML.etree.ElementTree编写XML声明,python,xml,elementtree,Python,Xml,Elementtree,我正在使用生成Python中的XML文档,但转换为纯文本时,tostring函数不包含 来自xml.etree.ElementTree导入元素,tostring 文档=元素(“外部”) 节点=子元素(文档“内部”) node.NewValue=1 打印到字符串(文档)#输出“” 我需要字符串包含以下XML声明: <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 然而,似乎没有任何记录在案的方法来做到这一点 是否有

我正在使用生成Python中的XML文档,但转换为纯文本时,
tostring
函数不包含

来自xml.etree.ElementTree导入元素,tostring
文档=元素(“外部”)
节点=子元素(文档“内部”)
node.NewValue=1
打印到字符串(文档)#输出“”
我需要字符串包含以下XML声明:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

然而,似乎没有任何记录在案的方法来做到这一点

是否有适当的方法在
ElementTree
中呈现XML声明?

我将使用lxml(请参阅)

然后你可以:

from lxml import etree
document = etree.Element('outer')
node = etree.SubElement(document, 'inner')
print(etree.tostring(document, xml_declaration=True))
我会使用lxml(请参阅)

然后你可以:

from lxml import etree
document = etree.Element('outer')
node = etree.SubElement(document, 'inner')
print(etree.tostring(document, xml_declaration=True))

我惊讶地发现,
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

看。即使这样,我也不认为不自己编写“standalone”属性就可以获得它。

我惊讶地发现
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

看。即使这样,我也不认为不自己编写“standalone”属性就可以得到它。

我最近遇到了这个问题,在对代码进行了一些挖掘之后,我发现下面的代码片段是function
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, {})
def write(self、file、encoding=“us ascii”):
断言self.\u root不是None
如果不是hasattr(文件“写入”):
文件=打开(文件“wb”)
如果没有编码:
encoding=“us ascii”
elif编码!=“utf-8”和编码!=“us ascii”:
文件。写入(“\n”%
编码)
self.\u write(文件,self.\u根,编码,{})

因此,答案是,如果需要将XML头写入文件,请将
编码
参数设置为非
utf-8
us ascii
,例如
utf-8

我最近在挖掘代码后遇到了这个问题,我发现下面的代码片段是函数
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, {})
def write(self、file、encoding=“us ascii”):
断言self.\u root不是None
如果不是hasattr(文件“写入”):
文件=打开(文件“wb”)
如果没有编码:
encoding=“us ascii”
elif编码!=“utf-8”和编码!=“us ascii”:
文件。写入(“\n”%
编码)
self.\u write(文件,self.\u根,编码,{})
因此,答案是,如果需要将XML头写入文件,请将
编码
参数设置为非
utf-8
us ascii
,例如
utf-8

我将使用:

我将使用:


如果您只想打印,则此选项有效。尝试将其发送到文件时出错

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="  ")

如果您只想打印,则此选项有效。尝试将其发送到文件时出错

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="  ")
:

xml.etree.ElementTree.tostring使用encoding='utf8'编写xml编码声明

Python代码示例(适用于Python 2和Python 3):

:

xml.etree.ElementTree.tostring使用encoding='utf8'编写xml编码声明

Python代码示例(适用于Python 2和Python 3):


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>

1.

使用
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>

1.
在声明中包括“独立” 我在文档中找不到添加
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)
从xml.etree导入ElementTree作为ET
#样品
document=ET.Element(‘外部’)
node=ET.SubElement(文档“内部”)
et=et.ElementTree(文档)
#你需要的功能
def-tostring(元素、声明、编码=None、方法=None,):
类虚拟:
通过
数据=[]
data.append(声明+“\n”)
file=dummy()
file.write=data.append
ET.ElementTree(element).write(文件,编码,方法=method)
返回“”连接(数据)
#工作示例
xdec=“”
xml=tostring(文档,编码='utf-8',声明=xdec)
在声明中包括“独立” 我在文档中找不到添加
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)
从xml.etree导入ElementTree作为ET
#样品
document=ET.Element(‘外部’)
node=ET.SubElement(文档“内部”)
et=et.ElementTree(文档)
#你需要的功能
def-tostring(元素、声明、编码=None、方法=None,):
类虚拟:
通过
数据=[]
data.append(声明+“\n”)
file=dummy()
file.write=data.append
ET.ElementTree(element).write(文件,编码,方法=method)
返回“”连接(数据)
#工作示例
xdec=“”
xml=tostring(文档,编码='utf-8',声明=xdec)

另一个非常简单的选项是将所需的头连接到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)
xml=(字节('\n',encoding='utf-8')+ET.tostring(根))
xml=xml.decode('utf-8')
将open('invoice.xml',w+')作为f:
f、 写入(xml)

另一个非常简单的选项是将所需的头连接到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)
xml=(字节('\n',encoding='utf-8')+ET.tostring(根))
xml=xml.decode('utf-8')
将open('invoice.xml',w+')作为f:
f、 写入(xml)
简单

Python 2和3的示例(编码参数必须是utf8):

将xml.etree.ElementTree导入为ElementTree
tree=ElementTree.ElementTree(ElementTree.fromstring('123'))