gpt4 book ai didi

python - 使用python etree提取xml文件的一部分

转载 作者:行者123 更新时间:2023-11-30 23:12:05 24 4
gpt4 key购买 nike

我有一个很大的 xml 文件,如下所示。我只放了其中的一部分,因为它>2gb,所以您可以看到结构。基本上都是SubNetwork parents与我下面展示的结构相同。我想要做的是仅提取此 xml 文件的一部分 <ManagedElementId string="xxxx" /> (其中 xxx 我是输入变量)。这是我的代码和 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>

和代码

from xml.etree import ElementTree
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import XML, fromstring, tostring
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import SubElement
from xml.etree.ElementTree import Element, SubElement, Comment


with open(r"C:\\Users\\etihkru\\Desktop\\h4.xml", 'rt') as f:
root = ET.parse(f)
tree=root.getroot()
with open(r"C:\\Users\\etihkru\\Desktop\\list_of_xxx", 'r') as f2:
for line in f2:
line=line.rstrip()
line1='"' + line + '"'
xp_str1 = str(('.//ManagedElementId[@string='))
xp_str2 = str("]/../../")
str_elem = xp_str1 + line1 + xp_str2
for item in tree.findall(str_elem):
print ET.tostring(item)

和文件list_of_xxx如下:

3GALPAS
3GTUTI

如上所述,有数字 <ManagedElementId string=/> ,我只想提取 list_of_xxx 中的内容.

所以我想要如下输出:

<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>

所以,我想找到所有ManagedElementIds如 list_of_xxx 中所示,以及他们的 parent ManagedElementSubNetwork ,并按照上面给出的方式编写它们。每MangedElementid应如上所述与 parent 关闭。我正在使用没有 lxml 的 python 2.6,因为我无权安装它。

最佳答案

提取 XML 的部分(因为该部分存在于源 XML 中)应该是微不足道的。例如,获取包含您感兴趣的特定 ManagedElementIdManagedElement 将会很容易。但在这里,您似乎希望将它们包装在 SubNetwork 父节点中。

在源 XML 中,SubNetwork 包含您想要获取的元素和您想要从结果中剥离的其他元素的混合,因此实际上不存在这样的 SubNetwork 包含您想要的 ManagedElement 节点。

我们可以通过从源 XML 中提取 ManagedElement 节点,并将它们添加到重建的父 SubNetwork 节点来解决此问题:

.....
.....
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)

关于python - 使用python etree提取xml文件的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29949242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com