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
添加新的XML节点并在python中漂亮地打印XML_Python_Xml_Elementtree - Fatal编程技术网

添加新的XML节点并在python中漂亮地打印XML

添加新的XML节点并在python中漂亮地打印XML,python,xml,elementtree,Python,Xml,Elementtree,我可以使用ElementTree添加XML节点,但是当我以文本格式打开XML文件时,它会以一行的形式返回输出,而不是以树结构的形式返回。我还尝试使用minidom.toprettyxml,但我不知道如何将输出添加到原始XML中。因为我希望脚本在其他环境中是可复制的,所以我不喜欢使用诸如lxml之类的外部库。有人能帮我打印输出吗python 2.7 示例XML。这就是它在文本格式和资源管理器中的外观 <?xml version="1.0" encoding="utf-8"?> <

我可以使用ElementTree添加XML节点,但是当我以文本格式打开XML文件时,它会以一行的形式返回输出,而不是以树结构的形式返回。我还尝试使用minidom.toprettyxml,但我不知道如何将输出添加到原始XML中。因为我希望脚本在其他环境中是可复制的,所以我不喜欢使用诸如lxml之类的外部库。有人能帮我打印输出吗python 2.7

示例XML。这就是它在文本格式和资源管理器中的外观

<?xml version="1.0" encoding="utf-8"?>
<default_locators >
  <locator_ref>
    <name>cherry</name>
    <display_name>cherrycherry</display_name>
    <workspace_properties>
      <factory_progid>Workspace</factory_progid>
      <path>InstallDir</path>
    </workspace_properties>
  </locator_ref>
</default_locators>
<?xml version="1.0" encoding="utf-8"?>
<default_locators >
  <locator_ref>
    <name>cherry</name>
    <display_name>cherrycherry</display_name>
    <workspace_properties>
      <factory_progid>Workspace</factory_progid>
      <path>InstallDir</path>
    </workspace_properties>
  </locator_ref>
  <locator_ref>
    <name>berry</name>
    <display_name>berryberry</display_name>
    <workspace_properties>
      <factory_progid>Workspace</factory_progid>
      <path>C:\temp\temp</path>
    </workspace_properties>
  </locator_ref>
</default_locators>
返回的输出。运行脚本后,新节点将添加到sample.xml文件中,但它只返回一行输出,并从原始sample.xml文件中删除所有换行和缩进。至少当我以文本格式打开sample.xml文件时是这样的。但是,当我在资源管理器中打开sample.xml文件时,它看起来很好。我仍然像以前一样看到换行和缩进。即使在运行脚本之后,如何保持原始树结构为文本格式

<default_locators>
  <locator_ref>
    <name>cherry</name>
    <display_name>cherrycherry</display_name>
    <workspace_properties>
      <factory_progid>Workspace</factory_progid>
      <path>InstallDir</path>
    </workspace_properties>
  </locator_ref>
<locator_ref><name> berry</name><display_name>berryberry</display_name><workspace_properties><factory_progid>Workspace</factory_progid><path>c:\temp\temp</path></workspace_properties></locator_ref></default_locators>

樱桃
樱桃
工作空间
InstallDir
BerryBerryWorkspacec:\temp\temp

在elementTree中编写xml,如下所示:

import xml.etree.ElementTree as ET


def serialize_xml(write, elem, encoding, qnames, namespaces):
    tag = elem.tag
    text = elem.text
    if tag is ET.Comment:
        write("<!--%s-->" % _encode(text, encoding))
    elif tag is ET.ProcessingInstruction:
        write("<?%s?>" % _encode(text, encoding))
    else:
        tag = qnames[tag]
        if tag is None:
            if text:
                write(_escape_cdata(text, encoding))
            for e in elem:
                serialize_xml(write, e, encoding, qnames, None)
        else:
            write("\n<" + tag) ## '\n' added by namit
            items = elem.items()
            if items or namespaces:
                if namespaces:
                    for v, k in sorted(namespaces.items(),
                                       key=lambda x: x[1]):  # sort on prefix
                        if k:
                            k = ":" + k
                        write(" xmlns%s=\"%s\"" % (
                            k.encode(encoding),
                            _escape_attrib(v, encoding)
                            ))
                for k, v in sorted(items):  # lexical order
                    if isinstance(k, QName):
                        k = k.text
                    if isinstance(v, QName):
                        v = qnames[v.text]
                    else:
                        v = _escape_attrib(v, encoding)
                    write(" %s=\"%s\"" % (qnames[k], v))
            if text or len(elem):
                write(">")
                if text:
                    write(ET._escape_cdata(text, encoding))
                for e in elem:
                    serialize_xml(write, e, encoding, qnames, None)
                write("</" + tag + ">")
            else:
                write(" />")
    if elem.tail:
        write(ET._escape_cdata(elem.tail, encoding))

ET._serialize_xml=serialize_xml

tree = ET.parse(r"samplexml.xml")
root = tree.getroot()

locator_ref = ET.SubElement(root, "locator_ref")
name = ET.SubElement(locator_ref, "name")
name.text = " berry"
display_name = ET.SubElement(locator_ref, "display_name")
display_name.text = "berryberry"
workspace_properties = ET.SubElement(locator_ref, "workspace_properties")
factory_progid = ET.SubElement(workspace_properties,"factory_progid")
factory_progid.text = "WorkspaceFactory"
path = ET.SubElement(workspace_properties, "path")

ins_out=open("samplexml_1.xml",'wb',1000)
ET.ElementTree(locator_ref).write(ins_out,encoding="ASCII")
ins_out.close()
将xml.etree.ElementTree作为ET导入
def序列化xml(写入、元素、编码、QName、命名空间):
tag=elem.tag
text=elem.text
如果标签为ET,则注释:
写入(“%\u编码(文本,编码))
elif标签为ET.ProcessingInstruction:
写入(“%\u编码(文本,编码))
其他:
tag=qnames[tag]
如果标记为“无”:
如果文本:
写入(\u转义\u cdata(文本、编码))
对于元素中的e:
序列化xml(写入、e、编码、qnames、无)
其他:
写入(“\n”)
如果文本:
写入(ET.\U escape\U cdata(文本、编码))
对于元素中的e:
序列化xml(写入、e、编码、qnames、无)
写(“”)
其他:
写(“/>”)
如果元素尾:
写入(ET.\u escape\u cdata(elem.tail,编码))
ET._serialize_xml=serialize_xml
tree=ET.parse(r“samplexml.xml”)
root=tree.getroot()
定位器\u ref=ET.SubElement(根,“定位器\u ref”)
name=ET.SubElement(定位器_ref,“name”)
name.text=“berry”
display\u name=ET.SubElement(定位器\u ref,“display\u name”)
显示\u name.text=“berryberry”
工作空间_属性=ET.SubElement(定位器_ref,“工作空间_属性”)
factory\u progid=ET.SubElement(工作空间属性,“factory\u progid”)
factory\u progid.text=“WorkspaceFactory”
path=ET.SubElement(工作空间_属性,“路径”)
ins_out=open(“samplexml_1.xml”,“wb”,1000)
ET.ElementTree(locator\u ref).write(输入输出,编码=“ASCII”)
in_out.close()

这将在单行中写入完整的文件;不在xml尾部添加空格。

在elementTree中编写xml,如下所示:

import xml.etree.ElementTree as ET


def serialize_xml(write, elem, encoding, qnames, namespaces):
    tag = elem.tag
    text = elem.text
    if tag is ET.Comment:
        write("<!--%s-->" % _encode(text, encoding))
    elif tag is ET.ProcessingInstruction:
        write("<?%s?>" % _encode(text, encoding))
    else:
        tag = qnames[tag]
        if tag is None:
            if text:
                write(_escape_cdata(text, encoding))
            for e in elem:
                serialize_xml(write, e, encoding, qnames, None)
        else:
            write("\n<" + tag) ## '\n' added by namit
            items = elem.items()
            if items or namespaces:
                if namespaces:
                    for v, k in sorted(namespaces.items(),
                                       key=lambda x: x[1]):  # sort on prefix
                        if k:
                            k = ":" + k
                        write(" xmlns%s=\"%s\"" % (
                            k.encode(encoding),
                            _escape_attrib(v, encoding)
                            ))
                for k, v in sorted(items):  # lexical order
                    if isinstance(k, QName):
                        k = k.text
                    if isinstance(v, QName):
                        v = qnames[v.text]
                    else:
                        v = _escape_attrib(v, encoding)
                    write(" %s=\"%s\"" % (qnames[k], v))
            if text or len(elem):
                write(">")
                if text:
                    write(ET._escape_cdata(text, encoding))
                for e in elem:
                    serialize_xml(write, e, encoding, qnames, None)
                write("</" + tag + ">")
            else:
                write(" />")
    if elem.tail:
        write(ET._escape_cdata(elem.tail, encoding))

ET._serialize_xml=serialize_xml

tree = ET.parse(r"samplexml.xml")
root = tree.getroot()

locator_ref = ET.SubElement(root, "locator_ref")
name = ET.SubElement(locator_ref, "name")
name.text = " berry"
display_name = ET.SubElement(locator_ref, "display_name")
display_name.text = "berryberry"
workspace_properties = ET.SubElement(locator_ref, "workspace_properties")
factory_progid = ET.SubElement(workspace_properties,"factory_progid")
factory_progid.text = "WorkspaceFactory"
path = ET.SubElement(workspace_properties, "path")

ins_out=open("samplexml_1.xml",'wb',1000)
ET.ElementTree(locator_ref).write(ins_out,encoding="ASCII")
ins_out.close()
将xml.etree.ElementTree作为ET导入
def序列化xml(写入、元素、编码、QName、命名空间):
tag=elem.tag
text=elem.text
如果标签为ET,则注释:
写入(“%\u编码(文本,编码))
elif标签为ET.ProcessingInstruction:
写入(“%\u编码(文本,编码))
其他:
tag=qnames[tag]
如果标记为“无”:
如果文本:
写入(\u转义\u cdata(文本、编码))
对于元素中的e:
序列化xml(写入、e、编码、qnames、无)
其他:
写入(“\n”)
如果文本:
写入(ET.\U escape\U cdata(文本、编码))
对于元素中的e:
序列化xml(写入、e、编码、qnames、无)
写(“”)
其他:
写(“/>”)
如果元素尾:
写入(ET.\u escape\u cdata(elem.tail,编码))
ET._serialize_xml=serialize_xml
tree=ET.parse(r“samplexml.xml”)
root=tree.getroot()
定位器\u ref=ET.SubElement(根,“定位器\u ref”)
name=ET.SubElement(定位器_ref,“name”)
name.text=“berry”
display\u name=ET.SubElement(定位器\u ref,“display\u name”)
显示\u name.text=“berryberry”
工作空间_属性=ET.SubElement(定位器_ref,“工作空间_属性”)
factory\u progid=ET.SubElement(工作空间属性,“factory\u progid”)
factory\u progid.text=“WorkspaceFactory”
path=ET.SubElement(工作空间_属性,“路径”)
ins_out=open(“samplexml_1.xml”,“wb”,1000)
ET.ElementTree(locator\u ref).write(输入输出,编码=“ASCII”)
in_out.close()
这将在单行中写入完整的文件;无需在xml尾部添加空格。

我认为您必须尝试。这是在Python中解析XML的最佳方法。 对于这类事情,它有着神奇的论点。 下面是一个例子:

import lxml.etree as etree

root = etree.Element("root")
for rn in range(10):
    etree.SubElement(root, "column_%s" % str(rn)).text = str(rn*rn)
pretty_data = etree.tostring(root, pretty_print=True, encoding = 'utf-8')
print final_data
结果:

我想你必须试试。这是在Python中解析XML的最佳方法。 对于这类事情,它有着神奇的论点。 下面是一个例子:

import lxml.etree as etree

root = etree.Element("root")
for rn in range(10):
    etree.SubElement(root, "column_%s" % str(rn)).text = str(rn*rn)
pretty_data = etree.tostring(root, pretty_print=True, encoding = 'utf-8')
print final_data

结果:

处理元素时,可以这样做:
element.tail='\n'

然后,它将被写在一行中。

当处理元素时,您可以这样做:
element.tail='\n'

然后,它将以单行形式写入。

@user1027101:检查更新的帖子;我已经为此编写了完整的代码。谢谢您的代码。我试过了,它可以像你提到的那样工作,但是你知道我如何将输出插入或附加到现有的XML文件中,而不是覆盖它吗?@user1027101:no;我们不能;这是一个和其他文件一样的文件;它不是任何我们可以插入或附加的python对象;我们必须创建新的或覆盖现有的。使用上面不完整的脚本,我可以将一些节点添加到现有的XML文件中。请参阅上面的“以txt格式返回的输出”。我所要做的就是把输出放在一棵有适当缩进的树中…@J.F.塞巴斯蒂安:你能帮忙吗?@user1027101:查看更新的帖子;我已经为此编写了完整的代码。谢谢您的代码。我试过了,它的工作原理与您提到的一样,但是您知道如何将输出插入或附加到现有的XML文件I中吗