2016-02-26 47 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>'