2013-08-28 35 views
0

我有2個XML(它們恰好是Android的文本資源),第一個是:如何從一個XML複製元素到另一個XML與Python

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="TXT_T1">AAAA</string> 
</resources> 

,第二個是

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="TXT_T2">BBBB</string> 
</resources> 

我知道我想要複製的元素的屬性,在我的示例中它是TXT_T1。使用python,如何將其複製到其他xml並將其粘貼到TXT_T2的後面?

回答

0

這隻會工作,爲您簡單的例子:

>>> from xml.dom.minidom import parseString, Document 
>>> def merge_xml(dom1, dom2): 
    node_to_add = None 
    dom3 = Document() 
    for node_res in dom1.getElementsByTagName('resources'): 
     for node_str in node_res.getElementsByTagName('string'): 
      if 'TXT_T1' == node_str.attributes.values()[0].value: 
       node_to_add = node_str 
       break 

    for node_res in dom2.getElementsByTagName('resources'): 
     node_str3 = dom3.appendChild(node_res) 
     for node_str in node_res.getElementsByTagName('string'): 
      node_str3.appendChild(node_str) 
      if 'TXT_T2' in node_str.attributes.values()[0].value and node_to_add is not None: 
       node_str3.appendChild(node_to_add) 
    return dom3.toxml() 

>>> dom2 = parseString('''<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="TXT_T2">BBBB</string> 
</resources>''') 
>>> dom1 = parseString('''<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="TXT_T1">AAAA</string> 
</resources>''') 
>>> print merge_xml(dom1, dom2) 
<?xml version="1.0" ?><resources> 

<string name="TXT_T2">BBBB</string><string name="TXT_T1">AAAA</string></resources> 
2

LXML是XML解析之王。我不知道如果這是你在找什麼,但你可以嘗試這樣的事情

from lxml import etree as et 

# select a parser and make it remove whitespace 
# to discard xml file formatting 
parser = et.XMLParser(remove_blank_text=True) 

# get the element tree of both of the files 
src_tree = et.parse('src.xml', parser) 
dest_tree = et.parse('dest.xml', parser) 

# get the root element "resources" as 
# we want to add it a new element 
dest_root = dest_tree.getroot() 

# from anywhere in the source document find the "string" tag 
# that has a "name" attribute with the value of "TXT_T1" 
src_tag = src_tree.find('//string[@name="TXT_T1"]') 

# append the tag 
dest_root.append(src_tag) 

# overwrite the xml file 
et.ElementTree(dest_root).write('dest.xml', pretty_print=True, encoding='utf-8', xml_declaration=True) 

這是假設,即第一檔被稱爲src.xml和第二dest.xml。這也假設你需要複製新元素的元素是父元素。如果沒有,您可以使用find方法找到您需要的父項,或者如果您不知道父項,則使用'TXT_T2'搜索標籤並使用tag.getparent()獲取父項。

+0

它的工作幾乎完美,除了添加的行不縮進 –

+0

我更新了帖子。您需要中斷XML文件的格式,並且可以通過創建解析器並將其設置爲刪除空白文本來完成。請記住在解析xml文件時傳遞解析器。原始代碼仍然有效,並且文檔的結構是有效的。但是,如果這讓你感到困擾,新代碼還會處理格式。 – NotNone

相關問題