0

私は2つのxmlを持っています(それらはたまたまAndroidテキストリソースです)。最初のものは次のとおりです。

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

そして2つ目は

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

コピーしたい要素の属性を知っています。私の例では TXT_T1 です。Pythonを使用して、それを他のxmlにコピーしてTXT_T2のすぐ後ろに貼り付ける方法は?

4

2 に答える 2

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 で、2 番目のファイルが dest.xml であると想定しています。これは、新しい要素をコピーする必要がある要素が親要素であることも前提としています。そうでない場合は、find メソッドを使用して必要な親を見つけることができます。親がわからない場合は、「TXT_T2」でタグを検索し、tag.getparent() を使用して親を取得します。

于 2013-08-28T15:33:35.293 に答える
1

これは、単純な例でのみ機能します。

>>> 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>
于 2013-08-28T15:10:48.070 に答える