解析嵌套的 XML 文件并获取 python 中上一个标签的值
Parse nested XML file and get the value of previous tag in python
我有一个巨大的嵌套 .xml 文件,其中包含很多条目。如果我知道 child ID,我需要的是找到一个以前的值。
提取我的 xml 文件:
<?xml version="1.0"?>
<nodes>
<node>
<node_id>0x2D</node_id>
<num_1>11</num_1>
<num_2>905.908</num_2>
<signs>
<sign>
<sign_id>30</sign_id>
<name>INDEX_0</name>
<size_b>842069</size_b>
<content>
<models>
<model>1_x</model>
<model>2_x</model>
<model>3_x</model>
<model>4_x</model>
</models>
<images>
<image>
<value>VALUE1</value>
<folder_ids>
<folder_id>012345678</folder_id>
</folder_ids>
</image>
<image>
<value>VALUE2</value>
<folder_ids>
<folder_id>1235365454</folder_id>
</folder_ids>
</image>
<image>
<value>VALUE3</value>
<folder_ids>
<folder_id>3562377456</folder_id>
<folder_id>3566743626</folder_id>
<folder_id>012345678</folder_id>
</folder_ids>
</image>
<image>
<value>VALUE4</value>
<folder_ids>
<folder_id>34627876</folder_id>
</folder_ids>
</image>
<image>
.
.
.
例如,如果我需要查找包含 012345678 folder_id 的所有值。
我尝试使用 lxml 库。
简单代码:
from lxml import etree
tree = etree.parse('D:\test_nested_xml.xml')
#root = etree.Element("root")
for element in tree.iter(tag="folder_id"):
if element.text == '012345678':
print("%s - %s" % (element.text, element.getparent))
但在输出中我得到以下条目:
012345678 - <bound method _Element.getparent of <Element folder_id at 0x2cf2648>>
012345678 - <bound method _Element.getparent of <Element folder_id at 0x2cf2620>>
而且这不是我需要的。
我的预期结果是这样的:
012345678 - VALUE1
012345678 - VALUE3
有人可以帮助我如何正确解析 xml 文件并获得我需要的东西吗?
您当前正在打印方法本身。
print("%s - %s" % (element.text, element.getparent))
如果想看returns是什么方法,需要调用它
print("%s - %s" % (element.text, element.getparent()))
您也可以使用 XPath 一步 select 所需的值:
search_id = '012345678'
for value in tree.xpath(f"//image[folder_ids/folder_id='{search_id}']/value"):
print(value.text)
我有一个巨大的嵌套 .xml 文件,其中包含很多条目。如果我知道 child ID,我需要的是找到一个以前的值。
提取我的 xml 文件:
<?xml version="1.0"?>
<nodes>
<node>
<node_id>0x2D</node_id>
<num_1>11</num_1>
<num_2>905.908</num_2>
<signs>
<sign>
<sign_id>30</sign_id>
<name>INDEX_0</name>
<size_b>842069</size_b>
<content>
<models>
<model>1_x</model>
<model>2_x</model>
<model>3_x</model>
<model>4_x</model>
</models>
<images>
<image>
<value>VALUE1</value>
<folder_ids>
<folder_id>012345678</folder_id>
</folder_ids>
</image>
<image>
<value>VALUE2</value>
<folder_ids>
<folder_id>1235365454</folder_id>
</folder_ids>
</image>
<image>
<value>VALUE3</value>
<folder_ids>
<folder_id>3562377456</folder_id>
<folder_id>3566743626</folder_id>
<folder_id>012345678</folder_id>
</folder_ids>
</image>
<image>
<value>VALUE4</value>
<folder_ids>
<folder_id>34627876</folder_id>
</folder_ids>
</image>
<image>
.
.
.
例如,如果我需要查找包含 012345678 folder_id 的所有值。 我尝试使用 lxml 库。 简单代码:
from lxml import etree
tree = etree.parse('D:\test_nested_xml.xml')
#root = etree.Element("root")
for element in tree.iter(tag="folder_id"):
if element.text == '012345678':
print("%s - %s" % (element.text, element.getparent))
但在输出中我得到以下条目:
012345678 - <bound method _Element.getparent of <Element folder_id at 0x2cf2648>>
012345678 - <bound method _Element.getparent of <Element folder_id at 0x2cf2620>>
而且这不是我需要的。
我的预期结果是这样的:
012345678 - VALUE1
012345678 - VALUE3
有人可以帮助我如何正确解析 xml 文件并获得我需要的东西吗?
您当前正在打印方法本身。
print("%s - %s" % (element.text, element.getparent))
如果想看returns是什么方法,需要调用它
print("%s - %s" % (element.text, element.getparent()))
您也可以使用 XPath 一步 select 所需的值:
search_id = '012345678'
for value in tree.xpath(f"//image[folder_ids/folder_id='{search_id}']/value"):
print(value.text)