【问题标题】:Using a dash in a xpath does not work in py-dom-xpath在 xpath 中使用破折号在 py-dom-xpath 中不起作用
【发布时间】:2012-03-05 20:14:45
【问题描述】:

我很喜欢在 Debian 4.1.1-21 下使用 py-dom-xpath 和 python 2.7.2。
一切都很好,而不是一个 XML 元素。

每当我尝试检查 XML 文档中的 xpath,如 //AAA/BBB/CCC-DDD 时,都找不到路径。它是唯一一个带有破折号- 的节点。我已经尝试过逃离破折号,但没有成功。

我还尝试了//*[name()='CCC-DDD']starts-withcontains 语句。该元素肯定在 XML 中,并且拼写也正确。

我尝试了online xpath validation site,它在那里完美无瑕,即使是破折号。

感谢任何帮助。

【问题讨论】:

  • 你试试 lxml.etree 吗?这是一种高效且 Python 式的 xml 解析方式。
  • 使用来自@unutbu、'''<root><AAA><BBB><CCC-DDD>xyz</CCC-DDD></BBB></AAA></root>'''、Debian Wheezy 上的 Python 2.7.3 和 py-dom-xpath-0.1、xpath.findnode('//AAA/BBB/CCC-DDD', doc) 的示例 XML 对我有用。您能提供您的 XML 输入文档吗?
  • 从你的问题开始:Debian 4?已经 4 年没有得到安全修复了……你应该认真考虑更新。
  • 另外,如果这不起作用,则可能是 py-dom-xpath 中的错误(因为它是有效的 XML)。这也可能是某种编码问题。您能否提供一个小型示例数据集(SSCCE)?

标签: python xml xpath


【解决方案1】:

也可能是某种编码问题。

这很可能是导致问题的原因。确认破折号实际上是 U+002D ('-') 通过 grepping 显示文件中每个破折号周围的上下文:

grep -o '...-...' input-file.xml

而且在您的脚本中。 Different characters that look like dashes (etc.) 不会相互匹配。

【讨论】:

    【解决方案2】:

    是否使用lxml 选项? XPath 中的破折号在那里可以正常工作:

    import lxml.etree as ET
    
    content = '''<root><AAA><BBB><CCC-DDD>xyz</CCC-DDD></BBB></AAA></root>'''
    doc = ET.fromstring(content)
    print(doc.xpath('//AAA/BBB/CCC-DDD'))
    

    产量

    [<Element CCC-DDD at 0xb746f504>]
    

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多