微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 xpath 将 XML 文件解析为字典

如何解决使用 xpath 将 XML 文件解析为字典

前提是我有一个 XML 响应:

from lxml import etree
XML_string= '''<div type="description" xml:base="elpais.es" xml:lang="es" xml:id="f0910b98">
<p xml:id="_657a490035" n="0001">blabla1</p>
<p xml:id="_657a490036" n="0002">blabla2. bla bla 2.</p>
<p xml:id="_657a490037" n="0003">blabla3.blabla3</p>
<p xml:id="_657a490038" n="0004">bla4</p></div>'''

我解析如下:

parser = etree.XMLParser(resolve_entities=False,strip_cdata=False,recover=True,ns_clean=True)
XML_tree = etree.fromstring(XML_string.encode(),parser=parser)

我将 XML 转换为 dict 后,如下所示:

result_list = [{'id':"_657a490035",'n':'001','text':'blabla1'},{'id':"_657a490036",'n':'002','text':'blabla2'}
etc

我非常接近:

all_paras = XML_tree.xpath('.//p[@xml:id]')
result_list = []
for para in all_paras:
    result_list.append({'text':para.text,'id':'id?','n':'n??'})

我不知道如何访问节点段中的属性内容

需要帮助吗?

编辑: 如果您这样做,请注意:

for para in all_paras:
     print(para.attrib)

我得到了奇怪的字典:

 '{http://www.w3.org/XML/1998/namespace}id': '_657a490035','n': '0001'}

出于某种原因 xml:id 进入这个:{http://www.w3.org/XML/1998/namespace}id'

解决方法

不幸的是,您正与命名空间纠缠不清。处理该问题的一种方法是使用 local-name():

for para in all_paras:   
    #I simplified the id attribute value a bit,for simplicity 
    result_list.append({'id':para.xpath('./@*[local-name()="id"]')[0],'n':para.xpath('./@*[local-name()="n"]')[0],'text':para.text})
result_list

输出:

[{'id': '1','n': '0001','text': 'blabla1'},{'id': '2','n': '0002','text': 'blabla2. bla bla 2.'},{'id': '3','n': '0003','text': 'blabla3.blabla3'},{'id': '4','n': '0004','text': 'bla4'}]
, xml:xml:langxml:id 中的

xml:basea special namespace prefix,绑定到 http://www.w3.org/XML/1998/namespace 命名空间 URI。与任何其他前缀不同,它不需要在 XML 文档中声明。

您可以通过 xml:id 获取 xpath() 属性的值,如下所示:

for para in all_paras:
    result_list.append({'text': para.text,'id': para.xpath('@xml:id')[0]}) 

您也可以使用 get() 方法,但是您必须提供用大括号括起来的完整命名空间 URI:

for para in all_paras:
    result_list.append({'text': para.text,'id': para.get("{http://www.w3.org/XML/1998/namespace}id")}) 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?