【问题标题】:How do I skip validating the URI in lxml?如何跳过验证 lxml 中的 URI?
【发布时间】:2013-09-12 15:08:49
【问题描述】:

我正在使用 lxml 来解析一些 xml 文件。我不创建它们,我只是解析它们。一些文件包含命名空间的无效 uri。例如:

'D:\Path\To\some\local\file.xsl'

当我尝试处理它时出现错误:

lxml.etree.XMLSyntaxError: xmlns:xsi: 'D:\Path\To\some\local\file.xsl' is not a valid URI

有没有一种简单的方法可以用某些东西(任何东西,例如'http://www.googlefsdfsd.com/')替换任何无效的 uri?我想写一个正则表达式,但希望有一个更简单的方法。

【问题讨论】:

  • 什么是 googlefsdfsd.com/ ?对我来说它看起来很破碎
  • 没关系。它不必是一个有效的 url,只是一个 url(不是本地文件名的东西)。
  • 哦好的,我现在明白了

标签: python xml lxml


【解决方案1】:

解析器不喜欢命名空间 uri 中的反斜杠。

要在 uri 无效的情况下解析 xml,您可以实例化一个 lxml.etree.XMLParser 并将 recover 参数设置为 True,然后使用它来解析文件:

from lxml import etree
recovering_parser = etree.XMLParser(recover=True)
xml = etree.parse("xmlfile.xml", parser=recovering_parser)
...

【讨论】:

    【解决方案2】:

    如果您确定这些特定错误对您的用例不重要,您可以将其视为例外:

    try:
       # process your tree here
       SomeFn()
    
    except lxml.etree.XMLSyntaxError, e:
       print "Ignoring", e
       pass
    

    【讨论】:

    • 处理树时不会发生错误。包含反斜杠的命名空间 uri 在解析文档时会导致错误,因此您甚至没有到达拥有树的地步,捕获错误也无济于事。
    • 那么您可能需要使用r'D:\Path\To\some\local\file.xsl''D:\\Path\\To\\some\\local\\file.xsl''D:/Path/To/some/local/file.xsl''file:D:\Path\To\some\local\file.xsl' 之一
    • uris 不在 python 代码中,它们在 xml 文件中,因此在它们前面加上 r 或双转义反斜杠没有任何意义(而且我没有认为更改所有文件以替换反斜杠是一种选择 - OP 只想解析文档)。
    • 总是有一个简单的选择,只报告 XML 无效 - 这是由于 URI 无效,因此应该真正解决而不是解决。
    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 2016-08-25
    • 2010-09-25
    相关资源
    最近更新 更多