2016-02-26 18 views
4

我目前正在從YAML文件中取出字符串並將它們轉換爲XML。我使用lxml.etree來做到這一點,並且本質上是爲我的YAML文件中的每個值構建單個XML標記<msg>,然後使用lxml.etree.tostring()將其寫出。但是,給我的文件偶爾會有HTML標記,例如<a>,HTML實體(例如&nbsp;),以及字符喜歡&。 LXML解析器當前正在將所有這些轉換爲HTML實體,以便<a>變爲&lt;a&gt;&nbsp;變爲&amp;nbsp;&僅變成&amp;lxml.tostring錯誤地用HTML實體替換文本

在前兩種情況下,好像我會丟失這些數據,但我似乎無法弄清楚如何告訴LXML解析器不要爲我做任何HTML實體轉換。有沒有辦法做到這一點?

+0

什麼是解析器類?您可以通過將'resolve_entities' arg設置爲'False'來禁用實體解析,如\t ETCompatXMLParser,\t XMLParser或XMLTreeBuilder。 – felipsmartins

+0

我只是使用'lxml.etree.tostring()',它沒有'resolve_entities'選項的外觀。我本質上是採取樹和'pretty_print = True'輸出,所以我可以把它交給另一個模塊,這將保存新文件的地方。那些其他解析器是否允許使用像lxml一樣的好格式? – skeletalbassman

+0

我想真正的問題是,當我想寫或打印xml樹作爲一個字符串,它總是給我的實體沒有選擇來改變這一點。 – skeletalbassman

回答

0

您可以使用etree.Entity來創建正確序列化的實體。

這裏是一個非常「簡單」的例子 - 真實世界的用途通常會需要更復雜的操作(當然,你在處理XML):

>>> from lxml import etree, html 
>>> element = etree.fromstring('<p>Hel-lo World</p>') 
>>> parts = element.text.split('-') 
>>> element.text = parts[0] 
>>> shy = etree.Entity('shy') 
>>> shy.tail = parts[1] 
>>> element.append(shy) 
>>> html.tostring(element, encoding='unicode') 
'<p>Hel&shy;lo World</p>'