2016-09-07 76 views
1

对于我可怜的英语感到抱歉。但我需要你的帮助;(如何使用python替换xml中的元素

我有2个XML文件

之一是:

<root> 
<data name="aaaa"> 
<value>"old value1"</value> 
<comment>"this is an old value1 of aaaa"</comment> 
</data> 
<data name="bbbb"> 
<value>"old value2"</value> 
<comment>"this is an old value2 of bbbb"</comment> 
</data> 
</root> 

二是:

<root> 
<data name="aaaa"> 
<value>"value1"</value> 
<comment>"this is a value 1 of aaaa"</comment> 
</data> 
<data name="bbbb"> 
<value>"value2"</value> 
<comment>"this is a value2 of bbbb"</comment> 
</data> 
<data name="cccc"> 
<value>"value3"</value> 
<comment>"this is a value3 of cccc"</comment> 
</data> 
</root> 

one.xml将来自两个更新。 xml。

所以,one.xml应该是这样的。

one.xml(后):

<root> 
<data name="aaaa"> 
<value>"value1"</value> 
<comment>"this is a value1 of aaaa"</comment> 
</data> 
<data name="bbbb"> 
<value>"value2"</value> 
<comment>"this is a value2 of bbbb"</comment> 
</data> 
</root> 

数据名称= “CCCC” 中不存在one.xml。因此被忽略。

其实我想做的事从数据库

  • 更新我的one.xml由两个(它包含了只有应用程序使用DATA-列表)

    1. 下载two.xml(整个列表)。 xml

    任何可以帮助我请!! 谢谢!

    ============================================== ================ xml.etree.ElementTree
    您的代码适用于该示例。但我在真正的xml文件中发现了一个问题。

    真正one.xml包含:

    <?xml version="1.0" encoding="utf-8"?> 
    <root> 
        <resheader name="resmimetype"> 
         <value>text/microsoft-resx</value> 
        </resheader> 
        <resheader name="version"> 
         <value>2.0</value> 
        </resheader> 
        <resheader name="reader"> 
         <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 
        </resheader> 
        <resheader name="writer"> 
         <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> 
        </resheader> 
    
        <data name="NotesLabel" xml:space="preserve"> 
         <value>Hinweise:</value> 
         <comment>label for input field</comment> 
        </data> 
        <data name="NotesPlaceholder" xml:space="preserve"> 
         <value>z . Milch kaufen</value> 
         <comment>example input for notes field</comment> 
        </data> 
        <data name="AddButton" xml:space="preserve"> 
         <value>Neues Element hinzufügen</value> 
         <comment>this string appears on a button to add a new item to the list</comment> 
        </data> 
    </root> 
    

    看来,resheader造成麻烦。 你有什么想法解决?

  • +0

    如何将'one.xml'更新为'two.xml'?为什么它有python标签? –

    +0

    我想用python脚本更新xml文件。 –

    +0

    two.xml是一个完整的列表db文件。 –

    回答

    0

    您可以使用xml.etree.ElementTree,虽然有propably更优雅的方式,这应该适合在内存中,如果name S IN two.xml

    import xml.etree.ElementTree as ET 
    tree_one = ET.parse('one.xml') 
    root_one = tree_one.getroot() 
    tree_two = ET.parse('two.xml') 
    root_two = tree_two.getroot() 
    
    data_two=dict((e.get("name"), e) for e in root_two.findall("data")) 
    
    for eo in root_one.findall("data"): 
        name=eo.get("name") 
        tail=eo.tail 
        eo.clear() 
        eo.tail=tail 
        en=data_two[name] 
        for k,v in en.items(): 
         eo.set(k,v) 
        eo.extend(en.findall("*")) 
        eo.text=en.text 
    
    tree_one.write("one.xml") 
    

    是独一无二的。如果你的文件不装入内存,你可以将文件工作只要单个data条目适合,仍然使用xml.dom.pulldom

    +0

    谢谢!现在我离开办公室 –

    +0

    明天就会试试。无论如何非常感谢你!上帝保佑你:D –

    +0

    我希望这件作品足够好。 :) – janbrohl