2016-03-23 13 views
1

lxml.objectifyrecover=True ile ilgili herhangi bir ipucu var mı?lxml.objectify öznitelikleri olmadan özniteliği ayrıştıramaz - kurtarma gerekir = Ttrue

Öznitelikleri alıntılanmadığı yerde xml var -> name = value yerine name = 'value'.

Aşağıda bazı örnek kodlar ... XML biçimlendirmesi üzerinde denetimim yok, böylece geri dönüp değiştiremiyorum. etree ayrıştırma hatası

File "<string>", line unknown 
XMLSyntaxError: AttValue: " or ' expected, line 4, column 21 

lxml.objectify CODE

işliyor -

xmlSample="""<dict> 
<maptable> 
    <hdterm displevel=1 autlookup entrytype=1>Source term</hdterm> 
</maptable> 
</dict>""" 

GETİRMEDİĞİ bir cevap almazsam ben

import io 
#p = objectify.XMLParser(recover=True) 

root = objectify.fromstring(xmlSample) 

# returns attributes in element node as dict 
attrib = root.getattrib() 

# how to extract element data 
tbl = root.mytable 

print("root.mytable type=%s" % type(tbl)) 
yeniden var

lxml.etree - WORKS!

from lxml import etree, objectify 

import io 
xmlIO = io.StringIO(xmlSample) 

p = etree.XMLParser(recover=True) 

tree = etree.parse(xmlIO, parser=p) 
root = tree.getroot() 
print(root.tag) 

ÇIKIŞ:

myxml 

cevap

0

GÜNCELLEME:

Eğer bozuk XML belgesini kurtarmak için çalışacağız bir ayrıştırıcı oluşturmak için objectify.makeparser() için recover=True seçeneği geçebilir ortaya çıktı. Sonra şöyle, objectify.fromstring() için oluşturulan ayrıştırıcı geçirebilirsiniz:

from lxml import etree, objectify 

xmlSample="""<dict> 
<maptable> 
    <hdterm displevel=1 autlookup entrytype=1>Source term</hdterm> 
</maptable> 
</dict>""" 

parser = objectify.makeparser(recover=True) 
root = objectify.fromstring(xmlSample, parser) 

print(type(root.maptable.hdterm)) 
# output : 
# <type 'lxml.objectify.StringElement'> 

İLK YANIT:

Sen ikisini birleştirebilirsiniz; recover=True ile etree kırık XML girişi düzeltmek için, ve sonra objectify iyi biçimlendirilmiş ara XML Ayrıştırma:

from lxml import etree, objectify 

xmlSample="""your_xml_here""" 

p = etree.XMLParser(recover=True) 
well_formed_xml = etree.fromstring(xmlSample, p) 
root = objectify.fromstring(etree.tostring(well_formed_xml)) 
+0

Teşekkür! Bunu düşündüm. Gerçek XML çok büyük dosyalardır ve bu yaklaşım 3 kez ayrıştırmayı gerektirecektir: xml-> etree, etree-> good_xml, good_xml-> nesneleri. Artı verileri orijinal XML'ye geri izlemek sorunlu olabilir. – frankr6591

+0

Sanırım hiçbir objectify.XMLParser (kurtarma = True) var mı? Veya nesnel ayrıştırıcı yerine geçmek için? – frankr6591

+0

@ frankr6591 Sanırım 'recover = True' seçeneğini' objecdtify''a iletmenin yolunu buldum! – har07