2015-02-19 2 views
0

У меня есть xml.file, как показано ниже, и я пытаюсь разобрать его с мини-миром python, но есть некоторые проблемы. Я хочу извлечь некоторые атрибуты как <ManagedElementId string или <associatedSite string = "Site=site00972"/>, но не повезло. С помощью python minidom tutorials в Интернете мне не удалось это сделать, поэтому мне нужно помочь мне показать, как это сделать. Вот моя попытка:Python minidom не может разобрать xml

#!/usr/bin/python 
import os 
import xml.dom.minidom 
from xml.dom import minidom 
from xml.dom.minidom import parseString,parse 
from xml.dom.minidom import Node 


xmldoc = minidom.parse("proba.xml") 

model= xmldoc.getElementsByTagName('ManagedElementId string = ') 
for node in model: 
    print node.firstChild.nodeValue 

и я хочу получить значение между строкой.

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE Model SYSTEM "/opt/ericsson/arne/etc/arne12_2.dtd"> 
<Model version = "1" importVersion = "12.2"> 
<!--Validate: /opt/ericsson/arne/bin/import.sh -f 4_siu_create.xml \ -val:rall --> 
    <Create> 
     <SubNetwork userLabel = "ZLNOUR_SIU" networkType = "IPRAN"> 
      <ManagedElement sourceType = "SIU"> 
       <ManagedElementId string = "siu009722"/> 
       <primaryType type = "STN"/> 
       <managedElementType types = ""/> 
       <associatedSite string = "Site=site00972"/> 
       <nodeVersion string = "T11A"/> 
       <platformVersion string = ""/> 
       <swVersion string = ""/> 
       <vendorName string = ""/> 
       <userDefinedState string = ""/> 
       <managedServiceAvailability int = "1"/> 
       <isManaged boolean = "true"/> 
       <connectionStatus string = "OFF"/> 
       <Connectivity> 
        <DEFAULT> 
         <emUrl url = "http://10.131.203.117:80/"/> 
         <ipAddress string = "10.131.203.117"/> 
         <oldIpAddress string = "int dummy=0"/> 
         <hostname string = ""/> 
         <nodeSecurityState state = "ON"/> 
         <boardId string = ""/> 
         <Protocol number = "0"> 
          <protocolType string = "SNMP"/> 
          <port int = "161"/> 
          <protocolVersion string = "v2c"/> 
          <securityName string = ""/> 
          <authenticationMethod string = ""/> 
          <encryptionMethod string = ""/> 
          <communityString string = "public"/> 
          <context string = ""/> 
          <namingUrl string = ""/> 
          <namingPort int = ""/> 
          <notificationIRPAgentVersion string = ""/> 
          <alarmIRPAgentVersion string = ""/> 
          <notificationIRPNamingContext context = ""/> 
          <alarmIRPNamingContext context = ""/> 
         </Protocol> 
         <Protocol number = "1"> 
          <protocolType string = "SSH"/> 
          <port int = "22"/> 
          <protocolVersion string = ""/> 
          <securityName string = ""/> 
          <authenticationMethod string = ""/> 
          <encryptionMethod string = ""/> 
          <communityString string = ""/> 
          <context string = ""/> 
          <namingUrl string = ""/> 
          <namingPort int = ""/> 
          <notificationIRPAgentVersion string = ""/> 
          <alarmIRPAgentVersion string = ""/> 
          <notificationIRPNamingContext context = ""/> 
          <alarmIRPNamingContext context = ""/> 
         </Protocol> 
         <Browser> 
          <browser string = ""/> 
          <browserURL string = ""/> 
          <bookname string = ""/> 
         </Browser> 
        </DEFAULT> 
       </Connectivity> 
       <Tss> 
        <Entry> 
         <System string = "siu009722"/> 
         <Type string = "NORMAL"/> 
         <User string = "admin"/> 
         <Password string = "siu009722"/> 
        </Entry> 
        <Entry> 
         <System string = "siu009722"/> 
         <Type string = "SECURE"/> 
         <User string = "admin"/> 
         <Password string = "siu009722"/> 
        </Entry> 
       </Tss> 
       <Relationship> 
        <AssociableNode TO_FDN = "FtpServer=SMRSSLAVE-rtwaned1o,FtpService=swstore-rtwaned1o" AssociationType = "ManagedElement_to_ftpSwStore"/> 
        <AssociableNode TO_FDN = "FtpServer=SMRSSLAVE-rtwaned1o,FtpService=cmdown-rtwaned1o" AssociationType = "ManagedElement_to_neTransientCmDown"/> 
        <AssociableNode TO_FDN = "FtpServer=SMRSSLAVE-rtwaned1o,FtpService=cmup-rtwaned1o" AssociationType = "ManagedElement_to_neTransientCmUp"/> 
        <AssociableNode TO_FDN = "FtpServer=SMRSSLAVE-rtwaned1o,FtpService=pmup-rtwaned1o" AssociationType = "ManagedElement_to_neTransientPm"/> 
        <AssociableNode TO_FDN = "ManagementNode=ONRM" AssociationType = "MgmtAssociation"/> 
        <AssociableNode TO_FDN = "SubNetwork=ZLNOUR3,MeContext=rbs009721,ManagedElement=1,NodeBFunction=1" FROM_FDN = "SubNetwork=ZLNOUR_SIU,ManagedElement=siu009722,StnFunction=STN_ManagedFunction" AssociationType = "StnFunction_to_NodeBFunction"/> 
       </Relationship> 
      </ManagedElement> 
     </SubNetwork> 
    </Create> 
</Model> 
+0

Что заставляет вас думать, 'getElementsByTagName («ManagedElementId строка =»)' будет работать? Вы можете найти имена тегов, но 'string =' не является частью имени тега. –

+0

Я бы рекомендовал * против * использовать мини-диск. DOM API очень многословный и неуклюжий и с трудом работает. Вместо этого используйте [ElementTree API] (https://docs.python.org/2/library/xml.etree.elementtree.html). –

ответ

2

Вы включая имя атрибута в вашем имени тега:

model= xmldoc.getElementsByTagName('ManagedElementId string = ') 

string = часть в не часть имени тега; в вашем документе нет таких тегов. Отбросьте string = часть:

>>> from xml.dom import minidom 
>>> tree = minidom.parseString(sample) 
>>> tree.getElementsByTagName('ManagedElementId') 
[<DOM Element: ManagedElementId at 0x1080baef0>] 

Этот элемент не имеет дочерних узлов; он имеет только значение атрибута:

>>> node = tree.getElementsByTagName('ManagedElementId')[0] 
>>> node.firstChild is None 
True 
>>> node.getAttribute('string') 
u'siu009722' 

Я настоятельно рекомендую вам держаться подальше от XML DOM; Вы были бы гораздо лучше, используя гораздо проще ElementTree API здесь:

>>> from xml.etree import ElementTree as ET 
>>> tree = ET.fromstring(sample) 
>>> tree.find('.//ManagedElementId') 
<Element 'ManagedElementId' at 0x1080af950> 
>>> tree.find('.//ManagedElementId').get('string') 
'siu009722' 
+0

ОК, я попробую его с ET, но с приведенным ниже примером я не могу получить значение, нужно ли печатать или что-то еще? – user3319356

+0

@ user3319356: Я использовал интерактивный интерпретатор, который повторяет результаты. В сценарии вы будете использовать печать, да. –

Смежные вопросы