3

我正在研究一个 xml 解析器。目标是解析多个不同的 xml 文件,其中前缀和标签保持一致,但名称空间发生变化

因此,我正在尝试:

  • 解析 xml 而<prefix:tags>不用命名空间解析(替换)前缀。前缀在文档之间保持不变。
  • 自动加载命名空间,以便标识符 ( <prefix:tag>) 可以替换为正确的命名空间。
  • 只需按标签解析xml

我试过了xml.etree.ElementTree

我还看了看,lxml 我没有在 lxml 中找到任何可以帮助我的XMLParser配置选项,尽管在这里我可以阅读作者建议lxml应该能够自动为我收集命名空间的答案。

有趣的是,parsed_file = etree.XML(file)失败并出现错误:

lxml.etree.XMLSyntaxError: Start tag expected, '<' not found, line 1, column 1

我想解析的文件的一个例子是here

4

2 回答 2

2

不关心 ns 前缀,关心完整的命名空间

有时,人们确实关心那些短前缀和忘记,它们是次要的。它们只是对完全限定名称空间的简短引用。例如

xmlns:trw="http://www.trw.com/20131231"

在 xml 中,从现在开始,"trw:"代表完全限定的命名空间"http://www.trw.com/20131231"。请注意,此前缀可以在任何后续元素中重新定义为任何其他名称空间,并且可能获得完全不同的含义。

另一方面,当你关心真正的含义时,这里完全限定的命名空间是什么意思,你可能会"trw:row"想到"{http://www.trw.com/20131231}row". 这个翻译的意思是可靠的,不会随着前缀的变化而改变。

解析引用的 xml

指向http://edgar.sec.gov/Archives/edgar/data/1267097/000104746914000925/trw-20131231.xml的链接指向一个 xml,该 xml 验证xmlstarletlxml能够解析。

您显示的错误消息是指流的第一个字符,因此您可能在文件中遇到 BOM 字节,或者您正在尝试读取 xml,它是 gzip 压缩的,应首先解压缩。

lxml 和命名空间

lxml可以很好地与命名空间一起使用。它允许您使用使用命名空间的 XPath 表达式。通过控制输出上的 namspace 前缀,它有点复杂,因为它依赖于xmlns属性,这些属性是序列化文档的一部分。如果你想修改前缀,你必须以某种方式组织这些xmlns属性,通常是通过将所有的移动到根元素。同时,lxml跟踪每个元素的完全限定命名空间,因此在序列化的时刻,它将尊重这个全名以及这个命名空间当前有效的前缀。

处理这些xmlna属性需要更多代码,请参阅lxml文档。

于 2014-05-15T20:43:18.787 回答
1
items = tree.xpath("*[local-name(.) = 'a_tag_goes_here']")

做了这项工作。最重要的是,我必须items手动浏览生成的列表来定义我想要的其他过滤功能。

于 2014-05-16T12:28:10.760 回答