使用python etree提取部分xml文件
我有一个大的xml文件,如下所示。我只放了一部分,因为它大于2gb,所以你可以看到它的结构。基本上,所有的使用python etree提取部分xml文件,python,xml,elementtree,Python,Xml,Elementtree,我有一个大的xml文件,如下所示。我只放了一部分,因为它大于2gb,所以你可以看到它的结构。基本上,所有的子网父节点的结构都与我下面展示的结构相同。我想做的是使用(其中xxx I是输入变量)只提取这个xml文件的一部分。以下是我的代码和xml: <Create> <SubNetwork networkType="GSM" userLabel="BSC"> . . </SubNetwork> <SubNetwork networkType="WCDMA"
子网父节点
的结构都与我下面展示的结构相同。我想做的是使用
(其中xxx I是输入变量)只提取这个xml文件的一部分。以下是我的代码和xml:
<Create>
<SubNetwork networkType="GSM" userLabel="BSC">
.
.
</SubNetwork>
<SubNetwork networkType="WCDMA" userLabel="RNC01">
.
.
</SubNetwork>
<SubNetwork networkType="IPRAN" userLabel="IPRAN">
.
.
</SubNetwork>
<SubNetwork networkType="WCDMA" userLabel="RNC02">
<ManagedElement sourceType="CELLO">
<ManagedElementId string="3GALPAS" />
<primaryType type="RBS" />
.
.
</ManagedElement>
<ManagedElement sourceType="CELLO">
<ManagedElementId string="3GTUTI" />
<primaryType type="RBS" />
.
.
</ManagedElement>
<ManagedElement sourceType="CELLO">
<ManagedElementId string="3GHHH" />
<primaryType type="RBS" />
.
.
</ManagedElement>
</SubNetwork>
</Create>
文件列表\u xxx
如下所示:
3GALPAS
3GTUTI
<SubNetwork networkType="WCDMA" userLabel="RNC02">
<ManagedElement sourceType="CELLO">
<ManagedElementId string="3GALPAS" />
<primaryType type="RBS" />
.
.
</ManagedElement>
</SubNetwork>
<SubNetwork networkType="WCDMA" userLabel="RNC02">
<ManagedElement sourceType="CELLO">
<ManagedElementId string="3GTUTI" />
<primaryType type="RBS" />
.
.
</ManagedElement>
</SubNetwork>
如前所述,
的数量很多,我只想提取xxx的列表中的那些
因此,我希望输出如下:
3GALPAS
3GTUTI
<SubNetwork networkType="WCDMA" userLabel="RNC02">
<ManagedElement sourceType="CELLO">
<ManagedElementId string="3GALPAS" />
<primaryType type="RBS" />
.
.
</ManagedElement>
</SubNetwork>
<SubNetwork networkType="WCDMA" userLabel="RNC02">
<ManagedElement sourceType="CELLO">
<ManagedElementId string="3GTUTI" />
<primaryType type="RBS" />
.
.
</ManagedElement>
</SubNetwork>
.
.
.
.
因此,我想找到所有的ManagedElement ID
,如清单xxx中所示,以及它们的父项ManagedElement
和子网
,并按照上面所示编写它们。如前所述,每个MangedElementid
都应与父级关闭。我使用的Python2.6没有lxml,因为我没有安装它的权利。从源XML中存在的XML部分的意义上提取XML部分应该是微不足道的。例如,获取包含您感兴趣的特定ManagedElementId
的ManagedElement
将很容易。但在这里,您似乎希望将它们包装在子网
父节点中
在源XML中,SubNetwork
包含要获取的元素和要从结果中剥离的其他元素的混合,因此实际上不存在只包含所需的ManagedElement
节点的子网络
我们可以通过从源XML中提取ManagedElement
节点,并将它们添加到重构的父子网络
节点来实现这一点:
.....
.....
for line in f2:
line = line.rstrip()
#get all subnet nodes containing certain ManagedElementId
subnet_path = ".//ManagedElementId[@string='{0}']/../.."
subnet_path = subnet_path.format(line)
for subnet in tree.findall(subnet_path):
#reconstruct subnet node:
parent = ET.Element(subnet.tag, attrib=subnet.attrib)
#path to find all ManagedElement containing certain ManagedElementId
content_path = ".//ManagedElementId[@string='{0}']/..".format(line)
#append all ManagedElement found to the new subnet:
for content in subnet.findall(content_path):
parent.append(content)
#print new subnet:
print ET.tostring(parent)
您发布的示例代码中有什么不起作用?我没有父级、子网和ManagedElement,我希望在输出中包含这些。谢谢,它工作得很好。我刚刚用ET.Element.my bad替换了ET.create,当我试图修改我的工作代码以符合您现有的代码时,这是一个复制粘贴错误。修正了我不得不问的新问题,因为在Python2.6上它不工作。