我正在开发一个xml解析器。 目标是解析许多不同的xml文件,其中前缀和标记保持一致,但名称空间更改。
我正在尝试:
<prefix:tags>
解析xml,而不用命名空间解析(替换)前缀。前缀在文档之间保持不变。<prefix:tag>
)。 我尝试了xml.etree.ElementTree
。
我也看过lxml
我没有找到lxml中XMLParser的任何配置选项可以帮助我,虽然here我可以读一个答案,其中作者建议lxml
应该能够为我收集名称空间自动。
有趣的是,parsed_file = etree.XML(file)
因错误而失败:
lxml.etree.XMLSyntaxError: Start tag expected, '<' not found, line 1, column 1
我要解析的文件的一个示例是here
答案 0 :(得分:2)
有时,人们会关心那些短前缀和遗忘,这是次要的。它们只是对完全限定名称空间的简短引用。例如。
xmlns:trw="http://www.trw.com/20131231"
xml中的表示从现在开始,"trw:"
代表完全限定的名称空间"http://www.trw.com/20131231"
。请注意,此前缀可以重新定义到任何后续元素中的任何其他命名空间,并且可能具有完全不同的含义。
另一方面,当您关心真正的意义,这意味着完全限定的命名空间,您可以将"trw:row"
视为"{http://www.trw.com/20131231}row"
。这种翻译的含义将是可靠的,并且不会随着前缀的改变而改变。
指向http://edgar.sec.gov/Archives/edgar/data/1267097/000104746914000925/trw-20131231.xml的链接会生成一个xml,该{xml会按xmlstarlet
进行验证,lxml
可以解析。
您显示的错误消息是指流的第一个字符,因此您可能在文件中遇到BOM字节,或者您正在尝试读取xml,这是gzip并应首先解压缩。
lxml
可以很好地处理命名空间。它允许您使用使用命名空间的XPath表达式。通过在输出上控制namspace前缀,它有点复杂,因为它依赖于xmlns
属性,它们是序列化文档的一部分。如果要修改前缀,则必须以某种方式组织这些xmlns
属性,通常是将所有属性移动到根元素。同时,lxml
跟踪每个元素的完全限定名称空间,因此在序列化时,它将遵循此全名以及此命名空间的当前有效前缀。
处理这些xmlna
属性需要更多代码,请参阅lxml
文档。
答案 1 :(得分:1)
items = tree.xpath("*[local-name(.) = 'a_tag_goes_here']")
完成了这项工作。最重要的是,我必须手动浏览生成的列表items
以定义我的其他所需过滤功能。