【问题标题】:Python minidom unwanted whitespacePython minidom 不需要的空格
【发布时间】:2012-03-15 23:20:24
【问题描述】:

我正在使用 Python 将数据写入 .xml 文件。我有这个名为 statistics.xml 的文件,每次我调用我的方法“writeIntoXml()”时,它都应该将数据添加到该统计 xml 文件中。现在 Python 完美地做到了这一点,唯一的问题是它在我将新数据写入文件之前在文件中的所有元素之间添加了不需要的空格。像这样:

<AantalTicketsPerUur>
    <Dag datum="2012-03-16">
        <Aantal_tickets Aantal="24" uurinterval="0u-1u"/>
        <Aantal_tickets Aantal="68" uurinterval="1u-2u"/>
        <Aantal_tickets Aantal="112" uurinterval="2u-3u"/>
        <Aantal_tickets Aantal="98" uurinterval="3u-4u"/>
    </Dag>
</AantalTicketsPerUur>

变成这样(中间没有空格的元素是新数据):

<AantalTicketsPerUur>


    <Dag datum="2012-03-16">


        <Aantal_tickets Aantal="24" uurinterval="0u-1u"/>


        <Aantal_tickets Aantal="68" uurinterval="1u-2u"/>


        <Aantal_tickets Aantal="112" uurinterval="2u-3u"/>


        <Aantal_tickets Aantal="98" uurinterval="3u-4u"/>


    </Dag>


    <Dag datum="2012-03-16">
        <Aantal_tickets Aantal="24" uurinterval="0u-1u"/>
        <Aantal_tickets Aantal="68" uurinterval="1u-2u"/>
        <Aantal_tickets Aantal="112" uurinterval="2u-3u"/>
        <Aantal_tickets Aantal="98" uurinterval="3u-4u"/>
    </Dag>
</AantalTicketsPerUur>

我该如何解决这个问题?注意:我确实使用 .toprettyxml() 方法

提前致谢

【问题讨论】:

标签: python xml parsing minidom


【解决方案1】:

您可能想使用toxml 而不是不会修改格式的toprettyxml:

def write_xml(filename, dom):
    f = open(filename, "w")
    f.write(dom.toxml("utf-8"))
    f.close()

【讨论】:

    【解决方案2】:

    我同意qgi的回答。但请注意,对于在根元素之外找到的 cmets,这两种方法似乎有相反的怪癖。例如,如果我用 minidom 解析这个 XML 文件...

    <?xml version="1.0" encoding="utf-8"?>
    
    <!-- testing 1 -->
    <!-- testing 2 -->
    
    <sources autodelete="false" syncmedia="true" multivalue_separator=";; ">
    
        <!-- testing 3 -->
        <source 
            id_field="Lex GUID"
            source_audio_folder="samples/audio"
            source_image_folder="samples/pictures" >
            <source_field anki_field="Lex GUID" />
      </source>
    
        <!-- Test blah blah
            blah blah 
            blah 
        -->
        <source 
            id_field="Example"  
            source_audio_folder="samples/audio"
            source_image_folder="samples/pictures" >
            <source_field anki_field="Example" />
    
        </source>
    
    </sources>
    
    <!-- test THE END -->
    

    ...然后我将它保存为两个不同的文件,toxml 很好地保留了这些外部部分(但根内部没有任何内容),而 toprettyxml 仅保留根内部的部分。我正在使用 Python 2.7 顺便说一句。这是 tmp1.xml('漂亮'):

    <?xml version="1.0" encoding="utf-8"?><!-- testing 1 --><!-- testing 2 --><sources autodelete="false" multivalue_separator=";; " syncmedia="true">
    
        <!-- testing 3 -->
        <source id_field="Lex GUID" source_audio_folder="samples/audio" source_image_folder="samples/pictures">
            <source_field anki_field="Lex GUID"/>
      </source>
    
        <!-- Test blah blah
            blah blah 
            blah 
        -->
        <source id_field="Example" source_audio_folder="samples/audio" source_image_folder="samples/pictures">
            <source_field anki_field="Example"/>
    
        </source>
    
    </sources><!-- test THE END -->
    

    ...这里是 tmp2.xml(纯字符串):

    <?xml version="1.0" encoding="utf-8"?>
    <!-- testing 1 -->
    <!-- testing 2 -->
    <sources autodelete="false" multivalue_separator=";; " syncmedia="true">
    
    
    
        <!-- testing 3 -->
    
    
        <source id_field="Lex GUID" source_audio_folder="samples/audio" source_image_folder="samples/pictures">
    
    
            <source_field anki_field="Lex GUID"/>
    
    
        </source>
    
    
    
        <!-- Test blah blah
            blah blah 
            blah 
        -->
    
    
        <source id_field="Example" source_audio_folder="samples/audio" source_image_folder="samples/pictures">
    
    
            <source_field anki_field="Example"/>
    
    
    
        </source>
    
    
    
    </sources>
    <!-- test THE END -->
    

    以防万一,这里是生成这些的 Python 代码:

    import xml.dom.minidom as minidom
    tree = minidom.parse(file_path)
    s1 = tree.toxml('utf-8')
    s2 = tree.toprettyxml('    ', '\n', 'utf-8')
    with open ('tmp1.xml', mode='w') as outfile:  # Python 3 would also allow: encoding='utf-8'
        outfile.write(s1.encode('utf-8'))
    with open ('tmp2.xml', mode='w') as outfile:
        outfile.write(s2.encode('utf-8'))
    

    【讨论】:

    • 两种方法似乎都不一致地产生换行符(有时为 CR,有时为 CR LF;又名 \r 或 \r\n)。好消息是 toprettyxml() 的输出可以被读回,然后用 identical 格式保存回来,如果我能忍受每个之间的 3-4 个空行,那就太好了元素
    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多