2016-03-23 1 views
1

lxml.objectifyの使用方法に関するヒントは誰でもrecover=Trueにありますか?lxml.objectifyは引用符なしでattribを解析できません - 回復は必要ですか?

属性が引用されないxmlがあります。名前= '値'ではなく名前=値です。

以下はいくつかのサンプルコードです...私は元に戻って変更することはできませんので、私はXMLの書式を制御できません。 etree構文解析エラーが

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

lxml.objectify CODEある

に動作します -

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

に失敗した私は答えを取得しない場合、私は

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)) 
を再しなければなりませんの

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) 

OUTPUT:

myxml 

答えて

0

UPDATE:

を使用すると、不正な形式のXMLドキュメントを回復しようとするパーサを作成するためにobjectify.makeparser()recover=Trueオプションを渡すことができますが判明。

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

INITIAL ANSWER:

次の2つを組み合わせることができ、その後、あなたはそうのように、objectify.fromstring()に作成されたパーサを渡すことができます

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

ありがとう:よく形成された中間XMLを解析するために壊れたXML入力を修正して、objectifyするrecover=Trueetree!これについて考える。実際のXMLは非常に大きなファイルです。このアプローチでは、xml-> etree、etree-> good_xml、good_xml-> objectsの3回の解析が必要になります。元のXMLに戻ってデータをトレースすると、問題が発生する可能性があります。 – frankr6591

+0

objectify.XMLParser(recover = True)はありませんか?またはオブジェクト化パーサーを置き換える方法? – frankr6591

+0

@ frankr6591私は、 'recover = True'オプションを' objecdtify'に渡す方法を見つけたと思います!上記の** UPDATE **セクションを参照してください。 – har07

関連する問題