2012-01-13 10 views

Odpowiedz

2

Nie można zastąpić elementu z ElementTree można pracować tylko z Element. To jest tylko skrót od getroot().find().

Tak naprawdę trzeba:

  • wyodrębnić elementu nadrzędnego
  • korzystanie ze zrozumieniem (lub cokolwiek chcesz) tego elementu nadrzędnego

Ekstrakcja elementu nadrzędnego może być łatwe jeśli twój cel jest podstawowym podelementem (wystarczy zadzwonić pod numer getroot()), w przeciwnym razie musisz go znaleźć.

2

W przeciwieństwie do DOM, etree nie ma wyraźnych funkcji wielu dokumentów. Powinieneś jednak móc swobodnie przenosić elementy z jednego dokumentu do drugiego. Możesz po tym zadzwonić pod numer _setroot.

Dzwoniąc pod numer insert, a następnie , można zamienić węzeł w dokumencie.

1

Jestem nowy w Pythonie, ale znalazłem sprytny sposób, aby to zrobić:

pliku wejściowego input1.xml:

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

pliku wejściowego input2.xml:

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

Python kod: (uwaga, niechlujny i hakowaty)

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: https://stackoverflow.com/questions/2170610/access-elementtree-node-parent-node/2170994 
    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) 

daje wyjście:

-- 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> 

ta została zawarta z informacjami z:

Powiązane problemy