使用python etree提取部分xml文件

使用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"

我有一个大的xml文件,如下所示。我只放了一部分,因为它大于2gb,所以你可以看到它的结构。基本上,所有的
子网父节点
的结构都与我下面展示的结构相同。我想做的是使用
(其中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上它不工作。