Как я могу заменить дочерний элемент (ы) в ElementTree - PullRequest
6 голосов
/ 13 января 2012

Я хочу заменить дочерние элементы из одного дерева в другое, основываясь на некоторых критериях. Я могу сделать это с помощью понимания? Но как заменить элемент в ElementTree?

Ответы [ 3 ]

2 голосов
/ 13 января 2012

Нельзя заменить элемент из ElementTree, с которым можно работать только Element.

Даже когда вы звоните ElementTree.find(), это просто ярлык для getroot().find().

Так что вам действительно нужно:

* * 1010 извлечь родительский элемент использовать понимание (или что угодно) для этого родительского элемента

Извлечение родительского элемента может быть простым, если ваша цель является корневым подэлементом (просто вызовите getroot()), иначе вам придется его найти.

2 голосов
/ 13 января 2012

В отличие от DOM, у etree нет явных многодокументных функций.Однако вы должны иметь возможность свободно перемещать элементы из одного документа в другой.После этого вы можете позвонить _setroot.

Позвонив insert, а затем remove, вы можете заменитьузел в документе.

1 голос
/ 15 января 2013

Я новичок в Python, но я нашел хитрый способ сделать это:

Входной файл input1.xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <import ref="input2.xml" />
    <name awesome="true">Chuck</name>
</root>

Входной файл input2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
    <bar>blah blah</bar>
</foo>

Код Python: (примечание, грязный и хакерский)

import os
import xml.etree.ElementTree as ElementTree

def getElementTree(xmlFile):
    print "-- Processing file: '%s' in: '%s'" %(xmlFile, os.getcwd())
    xmlFH = open(xmlFile, 'r')
    xmlStr = xmlFH.read()
    et = ElementTree.fromstring(xmlStr)
    parent_map = dict((c, p) for p in et.getiterator() for c in p)
    # ref: /2042730/dostup-k-roditelskomu-uzlu-uzla-elementtree
    importList = et.findall('.//import[@ref]')
    for importPlaceholder in importList:
        old_dir = os.getcwd()
        new_dir = os.path.dirname(importPlaceholder.attrib['ref'])
        shallPushd = os.path.exists(new_dir)
        if shallPushd:
            print "  pushd: %s" %(new_dir)
            os.chdir(new_dir) # pushd (for relative linking)
        # Recursing to import element from file reference
        importedElement = getElementTree(os.path.basename(importPlaceholder.attrib['ref']))

        # element replacement
        parent = parent_map[importPlaceholder]
        index = parent._children.index(importPlaceholder)
        parent._children[index] = importedElement

        if shallPushd:
            print "  popd: %s" %(old_dir)
            os.chdir(old_dir) # popd

    return et

xmlET = getElementTree("input1.xml")
print ElementTree.tostring(xmlET)

дает вывод:

-- Processing file: 'input1.xml' in: 'C:\temp\testing'
-- Processing file: 'input2.xml' in: 'C:\temp\testing'
<root>
    <foo>
    <bar>blah blah</bar>
</foo><name awesome="true">Chuck</name>
</root>

это было завершено информацией из:

...