2015-04-11 1 views
0

У меня есть большой XML-файл, который выглядит следующим образом. В основном я хочу извлечь часть xml-файла, который имеет, например, этот "<ManagedElementId string = "rbs064841"/>".Как извлечь часть xml-файла

<Model version = "1" importVersion = "12.2"> 
     <Create> 
      <SubNetwork networkType = "WRAN" userLabel="AHPTUR14"> 
       <ManagedElement sourceType = "CELLO"> 
        <ManagedElementId string = "rbs064841"/> 
        <primaryType type = "RBS"/> 
        <managedElementType types = ""/> 
        <associatedSite string = "Site=site06484"/> 
        <nodeVersion string = "W12B"/> 
        <platformVersion string = "Cello 12.2"/> 
        <swVersion string = ""/> 
        <vendorName string = "ERICSSON"/> 
        <userDefinedState string = ""/> 
        <managedServiceAvailability int = "1"/> 
        <isManaged boolean = "true"/> 
        <neMIMVersion string = "vS.1.150"/> 
        <connectionStatus string = "ON"/> 
       </ManagedElement> 
      </SubNetwork> 
      <SubNetwork networkType = "WRAN" userLabel = "AHPT78"> 
       <ManagedElement sourceType = "CELLO"> 
        <ManagedElementId string = "rbs04798"/> 
        <primaryType type = "RBS"/> 
        <managedElementType types = ""/> 
        <associatedSite string = "Site=site06484"/> 
        <nodeVersion string = "W12B"/> 
        <platformVersion string = "Cello 12.2"/> 
        <swVersion string = ""/> 
        <vendorName string = "ERICSSON"/> 
        <userDefinedState string = ""/> 
        <managedServiceAvailability int = "1"/> 
        <isManaged boolean = "true"/> 
        <neMIMVersion string = "vS.1.150"/> 
        <connectionStatus string = "ON"/> 
       </ManagedElement> 
      </SubNetwork> 
      <SubNetwork networkType = "WRAN" userLabel = "AHPT4"> 
       <ManagedElement sourceType = "CELLO"> 
        <ManagedElementId string = "rbs04456"/> 
        <primaryType type = "RBS"/> 
        <managedElementType types = ""/> 
        <associatedSite string = "Site=site06484"/> 
        <nodeVersion string = "W12B"/> 
        <platformVersion string = "Cello 12.2"/> 
        <swVersion string = ""/> 
        <vendorName string = "ERICSSON"/> 
        <userDefinedState string = ""/> 
        <managedServiceAvailability int = "1"/> 
        <isManaged boolean = "true"/> 
        <neMIMVersion string = "vS.1.150"/> 
        <connectionStatus string = "ON"/> 
       </ManagedElement> 
      </SubNetwork> 
     </Create> 
    </Model> 

, который означает, что после разбора я wnat извлечь эту часть:

<SubNetwork networkType = "WRAN" userLabel="AHPTUR14"> 
      <ManagedElement sourceType = "CELLO"> 
       <ManagedElementId string = "rbs064841"/> 
       <primaryType type = "RBS"/> 
       <managedElementType types = ""/> 
       <associatedSite string = "Site=site06484"/> 
       <nodeVersion string = "W12B"/> 
       <platformVersion string = "Cello 12.2"/> 
       <swVersion string = ""/> 
       <vendorName string = "ERICSSON"/> 
       <userDefinedState string = ""/> 
       <managedServiceAvailability int = "1"/> 
       <isManaged boolean = "true"/> 
       <neMIMVersion string = "vS.1.150"/> 
       <connectionStatus string = "ON"/> 
      </ManagedElement> 
     </SubNetwork> 

так сделать поиск в большом файле XML с помощью ManagedElementId, и когда нашел экстракт часть его, под которым он был найден, смысл от <SubNetwork> до </SubNetwork>. Я знаю, как извлечь данные из XML-файла, но я не знаю, как извлечь часть xml.file. Я использую python ElementTree. Любое пособие было бы полезно.

ответ

1

Использование find с path, а затем получить относительный родительский узел, как это:

s = '''<Model version = "1" importVersion = "12.2"> 
     <Create> 
      <SubNetwork networkType = "WRAN" userLabel="AHPTUR14"> 
       <ManagedElement sourceType = "CELLO"> 
        <ManagedElementId string = "rbs064841"/> 
        <primaryType type = "RBS"/> 
        <managedElementType types = ""/> 
        <associatedSite string = "Site=site06484"/> 
        <nodeVersion string = "W12B"/> 
        <platformVersion string = "Cello 12.2"/> 
        <swVersion string = ""/> 
        <vendorName string = "ERICSSON"/> 
        <userDefinedState string = ""/> 
        <managedServiceAvailability int = "1"/> 
        <isManaged boolean = "true"/> 
        <neMIMVersion string = "vS.1.150"/> 
        <connectionStatus string = "ON"/> 
       </ManagedElement> 
      </SubNetwork> 
      <SubNetwork networkType = "WRAN" userLabel = "AHPT78"> 
       <ManagedElement sourceType = "CELLO"> 
        <ManagedElementId string = "rbs04798"/> 
        <primaryType type = "RBS"/> 
        <managedElementType types = ""/> 
        <associatedSite string = "Site=site06484"/> 
        <nodeVersion string = "W12B"/> 
        <platformVersion string = "Cello 12.2"/> 
        <swVersion string = ""/> 
        <vendorName string = "ERICSSON"/> 
        <userDefinedState string = ""/> 
        <managedServiceAvailability int = "1"/> 
        <isManaged boolean = "true"/> 
        <neMIMVersion string = "vS.1.150"/> 
        <connectionStatus string = "ON"/> 
       </ManagedElement> 
      </SubNetwork> 
      <SubNetwork networkType = "WRAN" userLabel = "AHPT4"> 
       <ManagedElement sourceType = "CELLO"> 
        <ManagedElementId string = "rbs04456"/> 
        <primaryType type = "RBS"/> 
        <managedElementType types = ""/> 
        <associatedSite string = "Site=site06484"/> 
        <nodeVersion string = "W12B"/> 
        <platformVersion string = "Cello 12.2"/> 
        <swVersion string = ""/> 
        <vendorName string = "ERICSSON"/> 
        <userDefinedState string = ""/> 
        <managedServiceAvailability int = "1"/> 
        <isManaged boolean = "true"/> 
        <neMIMVersion string = "vS.1.150"/> 
        <connectionStatus string = "ON"/> 
       </ManagedElement> 
      </SubNetwork> 
     </Create> 
    </Model>''' 

# I'd prefer lxml, but you need to work on xml module... 
import xml.etree.ElementTree as ET 
tree = ET.fromstring(s) 

# since the SubNetwork node you're interested is the parent of parent of ManagedElementId 
node = tree.find('.//ManagedElementId[@string="rbs064841"]/../../../') 

print ET.tostring(node) 
<SubNetwork networkType="WRAN" userLabel="AHPTUR14"> 
       <ManagedElement sourceType="CELLO"> 
        <ManagedElementId string="rbs064841"/> 
        <primaryType type="RBS"/> 
        <managedElementType types=""/> 
        <associatedSite string="Site=site06484"/> 
        <nodeVersion string="W12B"/> 
        <platformVersion string="Cello 12.2"/> 
        <swVersion string=""/> 
        <vendorName string="ERICSSON"/> 
        <userDefinedState string=""/> 
        <managedServiceAvailability int="1"/> 
        <isManaged boolean="true"/> 
        <neMIMVersion string="vS.1.150"/> 
        <connectionStatus string="ON"/> 
       </ManagedElement> 
      </SubNetwork> 

Если вы разбор из файла, используйте getroot():

root = ET.parse('file.xml') 
tree = root.getroot() 
... 

Надеюсь, это поможет.

+0

Я использую python 2.6, и у меня нет lxml, и из-за прав администратора я не могу его установить. Есть ли другой способ через xml.etree? – user3319356

+0

@ user3319356, последний блок кода предназначен именно для модуля 'xml'. Позвольте мне привести в порядок ответ, чтобы вы знали, что делать – Anzel

+0

Хорошо, спасибо, теперь все в порядке. Мне нужно разобрать большой файл, поэтому вместо переменной «s» я хочу проанализировать файл с открытым (r «C: \\ Users \\ etihkru \\ Desktop \\ BIg.xml», 'rt') как f: tree = ET.parse (f), но это не сработает? tree1 = ET.fromstring (дерево) – user3319356