2010-12-17 14 views
11

anda Python 2.4.3 kullanan ve bir ya da daha fazla etiketleri belirli bir özelliğinin değerlerini değiştirmek istediğinizPython/elementtree kullanarak XML ayrıştırılırken yorumları saklamak için nasıl

yükseltmek için izin verilmez, birlikte XML dosyasında güncellenen dosyada.

Ben argüman olarak bir XML dosyası alır ve

def update(file, state): 
    global Etree 
    try: 
     from elementtree import ElementTree 
     print '*** using ElementTree' 
    except ImportError, e: 
     print '***' 
     print '*** Error: Must install either ElementTree or lxml.' 
     print '***' 
     raise ImportError, 'must install either ElementTree or lxml' 
    #end try 

    doc = Etree.parse(file) 
    root = doc.getroot() 

    for element in root.findall('.//StateManageable'): 
     element.attrib['initialState'] = state 
    #end for 
    doc.write(file) 
#end def 

Bu, nitelikleri "Tüm gayet aşağıda gösterildiği gibi belirtilen her etiket için, bir öznitelik değiştiren bir Python komut dosyası oluşturmak başarmış

initialState "Orijinal XML'imin çok fazla XML yorumu içerdiği gerçeği hariç, güncellendi, ancak çoktan gittiler, bu da kötü.

Bu ayrıştırmanın yalnızca XML yapısını aldığından şüpheleniyorum, ancak XML-yorumlarının yapının bir parçası olduğunu düşündüm. Ayrıca, orijinal belgemin "insan tarafından okunabilir" biçimlendirmesinin çok uzun sürdüğünü fark ettim, ancak fark ettim ki beklenen davranış, xmllint --format veya XSL kullanarak biçimlendirmek gerekiyor.

+3

2.4? Benim sempatiklerim. – delnan

+0

bahse girerim, ilk betiklerimi oluşturmaya başladığımda zor zamanlar geldiğini fark ettim. İyi bir şey, örnekler bulduğum 2.7 :-) için – rhellem

cevap

16

Şimdi bunun eski olduğunu biliyorum, ancak yukarıdaki bu yanıtı yorumların nasıl saklanacağı konusunda tökezledim. Frederik'in published instructions ağacına nasıl yorum yazılacağı konusunda hala ElementTree'ın mevcut sürümleriyle çalışır, ancak en azından benim kullanımım için gerekenden daha fazlasını yapar. XML'i, benim için istenmeyen bir öğeye sarar. Ayrıca, korunan işlem talimatlarına ve yalnızca yorumlara da ihtiyacım yok. gibi

import xml.etree.ElementTree as ET 

class PCParser(ET.XMLTreeBuilder): 

    def __init__(self): 
     ET.XMLTreeBuilder.__init__(self) 
     # assumes ElementTree 1.2.X 
     self._parser.CommentHandler = self.handle_comment 

    def handle_comment(self, data): 
     self._target.start(ET.Comment, {}) 
     self._target.data(data) 
     self._target.end(ET.Comment) 

, bunu kullan bir 'ayrıştırıcı' olarak bu nesnenin bir örneğini oluşturmak ve sonra ElementTree.parse parametre olarak geçmek için(): Yani, o bu kadar sitede verilen sınıf azaltılmakta Bu:

parser = PCParser() 
self.tree = ET.parse(self.templateOut, parser=parser) 

Code için hiçbir kredi almak veya elementtree belgesiz kullanım için, ancak orijinal belge yapısını etkilemeden sadece bir yorum korunmasında benim için çalışıyor. Ve ElementTree için gelecekteki herhangi bir değişikliğin (tüm bu yıllardan sonra bu noktada pek olası görünmüyor) bunun kırılacağını unutmayın.

+0

'lxml' kullanıyorum ve işe yaramaya çalışıyorum. Lxml import etree'den et olarak ithal ediyorum. Ben self._parser' ile 'et' değiştirebilirim ama 'self._target' yerine ne kullanacağını anlayamıyorum. Yardım edebilir misin? – eoinzy

İlgili konular