【问题标题】:Python xml - remove spaces to get aligned xml documentPython xml - 删除空格以获取对齐的 xml 文档
【发布时间】:2021-11-29 00:00:44
【问题描述】:

我有一个 MyXml.xml 结构:

<?xml version='1.0' encoding='utf-8'?>
<tag1 atrib1='bla' atrib1='bla' atrib1='bla' atrib1='bla'>
    <tag2 atrib = 'something'>
        <tag3 atrib = 'something'>
           <tag4 atrib = '..'>
           </tag4>
        </tag3>
        <tag5 atrib = 'important'><div><h1>ContentFrom **OldXml.xml** </h1></div>
        ...
        </tag5>
    </tag2>
 </tag1>

有没有人知道如何使它成为这种形式(删除所有空格):

<?xml version='1.0' encoding='utf-8'?>
<tag1 atrib1='bla' atrib1='bla' atrib1='bla' atrib1='bla'>
<tag2 atrib = 'something'>
<tag3 atrib = 'something'>
<tag4 atrib = '..'>
<tag5 atrib = 'important'><div><h1>ContentFrom **OldXml.xml** </h1></div>
...

我试过了,但是不行:

# Read in the file to a DOM data structure.
original_document = minidom.parse("MyXml.xml")

# Open a UTF-8 encoded file, because it's fairly standard for XML.
stripped_file = codecs.open("New_MyXml.xml", "w", encoding="utf8")

# Tell minidom to format the child text nodes without any extra whitespace.
original_document.writexml(stripped_file, indent="", addindent="", newl="")

stripped_file.close()

编辑:

文件是通过创建元素的FOR循环创建的,最后是这样写的:

    dom = xml.dom.minidom.parseString(ET.tostring(root))
    xml_string = dom.toprettyxml()
    part1, part2 = xml_string.split('?>')
    with open("MyXml.xml", 'w') as xfile:
          xfile.write(part1 + 'encoding=\"{}\"?>\n'.format(m_encoding) + part2)
          xfile.close()

编辑在一行中打印整个文档的最新代码:

    dom = xml.dom.minidom.parseString(ET.tostring(root))
    xml_string = dom.toxml()
    part1, part2 = xml_string.split('?>')
    xmlstring = f'{part1} encoding="{m_encoding}"?>\n {part2}'
    with open("MyXml.xml", 'w') as xfile:
        for line in xmlstring.split("\n"):
          xfile.write(line.strip() + "\n")

【问题讨论】:

    标签: python xml parsing


    【解决方案1】:

    如果你只是想去掉空格,你根本不需要(或想要)一个 xml 解析器:

    from pathlib import Path
    
    inf = Path("my-input.xml")
    with inf.open() as f, inf.with_name(f"stripped-{inf.name}").open("w") as g:
        for line in f:
            g.write(line.strip() + "\n")
    

    Pathlib 在这里只是扮演os.pathopen 等角色:如果你碰巧不喜欢它,你可以在没有它的情况下重写(但pathlib 比为路径处理文本字符串要好得多)我确定你不想...)

    如果您确实需要使用解析器进行加载,请在编写时使用完全相同的技巧,但逐行迭代解析器对象。


    演示:

    from tempfile import TemporaryFile
    
    data = """<?xml version='1.0' encoding='utf-8'?>
    <tag1 atrib1='bla' atrib1='bla' atrib1='bla' atrib1='bla'>
        <tag2 atrib = 'something'>
            <tag3 atrib = 'something'>
               <tag4 atrib = '..'>
               </tag4>
            </tag3>
            <tag5 atrib = 'important'><div><h1>ContentFrom **OldXml.xml** </h1></div>
            ...
            </tag5>
        </tag2>
     </tag1>"""
    
    with TemporaryFile(mode="w+") as f, TemporaryFile(mode="w+") as g:
        f.write(data)
        f.seek(0)
        print("Before:")
        for line in f:
            print(line, end="")
            g.write(line.strip() + "\n")
    
        print("\n\nAfter:")
        g.seek(0)
        for line in g:
            print(line, end="")
    

    编辑:

    在您的情况下,有一个更简单的解决方案:根本不使用toprettyxml,使用toxml(更新:显然渲染时根本没有换行符)。但即使没有它,我们也可以做同样的事情:

    xml_string = dom.toprettyxml()
    part1, part2 = xml_string.split('?>')
    xmlstring = f'{part1} encoding="{m_encoding}"?>\n {part2}'
    with open("MyXml.xml", 'w') as xfile:
        for line in xmlstring.split("\n"):
            xfile.write(line.strip() + "\n")
    

    但我怀疑toprettyxml(indent="") 会做同样的事情:

    xml_string = dom.toprettyxml(indent="")
    ...
    with open("MyFile.xml", "w") as f:
        f.write(xml_string)
    

    【讨论】:

    • 感谢快速 RP,我已经尝试过这个解决方案,但文件没有任何反应
    • 我的文件一无所有
    • 检查我的演示代码是否适合您。我真的看不到 strip() 如何 剥离这条线,但如果你有一个有趣的失败模式,我当然很感兴趣。请注意,我确实使用了 两个 文件名,而不是尝试就地修改(这是可能的,但需要先读入 ram)。
    • 不幸的是,我无法测试这个解决方案,很难实现我的文件
    • 啊,好吧,伙计,刚刚试了一下,效果很好,只是想弄清楚如何在我的文件上实现它。我的文件是通过 python 脚本生成的,但我看不出这会产生什么影响?我只需要在文件创建结束时,再次加载文件,删除空格,就是这样,因为我需要将文件导入一些只能读取该格式的外部程序......谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多