【问题标题】:Getting contents of an lxml.objectify comment获取 lxml.objectify 评论的内容
【发布时间】:2016-09-08 12:16:08
【问题描述】:

我有一个使用 python 的lxml.objectify 库读取的 XML 文件。

我没有找到获取 XML 注释内容的方法:

<data>
  <!--Contents 1-->
  <some_empty_tag/>
  <!--Contents 2-->
</data>

我能够检索评论(有没有更好的方法?xml.comment[1] 似乎不起作用):

xml = objectify.parse(the_xml_file).getroot()
for c in xml.iterchildren(tag=etree.Comment):
   print c.???? # how do i print the contets of the comment?
   # print c.text  # does not work
   # print str(c)  # also does not work

正确的方法是什么?

【问题讨论】:

  • 我不希望能够用 xml 库解析 cmets;根据定义,它们不是 xml 结构的一部分,并且总是可以被任何工具忽略

标签: python lxml.objectify


【解决方案1】:

您只需要将子元素转换回字符串即可提取 cmets,如下所示:

In [1]: from lxml import etree, objectify

In [2]: tree = objectify.fromstring("""<data>
   ...:   <!--Contents 1-->
   ...:   <some_empty_tag/>
   ...:   <!--Contents 2-->
   ...: </data>""")

In [3]: for node in tree.iterchildren(etree.Comment):
   ...:     print(etree.tostring(node))
   ...:
b'<!--Contents 1-->'
b'<!--Contents 2-->'

当然,您可能想去掉不需要的包装。

【讨论】:

  • 我最终选择了这种方式,但它对我来说更像是一种破解,而不是真正的解决方案。
  • @RedX,这看起来确实像一个黑客,但事实并非如此。想想&lt;!-- comment --&gt; 块没有适当的 xml/html 属性设置,解析文本内容的唯一规则/方法是按原样呈现,至少对于 lxml 而言。
  • 我期待能够使用类似contentsrawtext 或任何其他函数来获取内容。我的意思是它只是文本(AFAIK)。
  • @RedX,好吧,我必须同意不同意,就像我上面说的,在 comment 元素中,是的,它有 tag 名称属性,它从其基类继承为“评论”,但除此之外,它实际上不包含任何内联属性或块内容。所以AFAIK这个节点没有文本内容,因为它是自动关闭的,这也意味着只有合法属性是tail——它自己和下一个元素之间的文本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 2022-06-10
  • 2014-01-23
  • 2019-08-08
  • 1970-01-01
相关资源
最近更新 更多