【问题标题】:Parsing ODF in Python with lxml在 Python 中使用 lxml 解析 ODF
【发布时间】:2011-09-14 20:29:48
【问题描述】:

我正在尝试解析 ODF 文件中的 content.xml。我已经将文件读入一个字符串,并且我有一个带有 lxml.etree 的树对象:

tree = etree.XML(string)

但现在我需要找到 text:a 或 text:h 的每个子元素。我在上一个问题中被告知我可以使用 XPath。我试过但每次都卡住了。甚至找不到这些元素之一。

如果我尝试:

elem = tree.xpath('//text:p')
我只是得到一个
XPathEvalError: Undefined namespace prefix

那么我如何以正确的顺序获得包含这两个子元素的列表,以便我可以遍历它们?

【问题讨论】:

    标签: python xml xpath lxml odf


    【解决方案1】:

    这是因为text 是命名空间的缩写,在ODF schema 中定义。试试

    tree.xpath('//text:a | //text:h',
               namespaces={'text': 'urn:oasis:names:tc:opendocument:xmlns:text:1.0'})
    

    | 是集合联合运算符。另见LXML docs

    【讨论】:

    • 太棒了!谢谢。现在,我如何在其中获取 OR 语句以便同时获取 text:p 和 text:h ?
    • 啊,是的,忘记了。现在将其添加到答案中。
    • 我可以通过谷歌“xpath 运算符”找到它。很抱歉没有尝试。但是昨晚我真的很沮丧。总之非常感谢! :)
    • @larsmans: | 是 XPath 联合运算符:不是“或”运算符。 XPath 有or 运算符。 | 是一个集合运算符(它的参数必须是节点集),而or 是一个布尔运算符——它的参数必须是布尔值。由于几乎可以将任何类型转换为布尔值,因此or 可以与几乎任何类型的参数一起使用(自动转换为布尔值),因此可以使用表达式$node-set1 or $node-set2 ,但是结果只是一个布尔值 - true()/false()| 只对节点集进行操作,其结果是一个节点集。
    • @DimitreNovaatchev:很抱歉造成混乱,但我习惯于将集合并集和析取集混为一谈(在我的生活中研究了太多逻辑:)。现在修正答案。
    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2012-07-29
    • 1970-01-01
    • 2014-08-22
    • 2023-04-01
    相关资源
    最近更新 更多