2017-08-26 28 views
0

我对Python很陌生,试图使用xml.dom.mindom解析xml文件。 xml在标签下缺少一些属性。我的要求是它至少应该尝试打印出现的属性。 minidom制作这些属性的字典,如果它没有找到该键,则会引发KeyError。我试图处理它,但不能成功地打印出现的。在解析不完整的XML时处理xml.dom.minidom中的KeyError

下面是我的Python代码:

from xml.dom import minidom 
try: 
xmldoc = minidom.parse('resources1.xml') 
document = xmldoc.getElementsByTagName("xmi:XMI")[0] 
JMSProviders = document.getElementsByTagName("resources.jms:JMSProvider") 
for JMSProvider in JMSProviders: 
    try:    #This try block to handle KeyError 

     id_name = JMSProvider.attributes["xmi:id"] 
     name_id = id_name.value 
     j_JMSName = JMSProvider.attributes["name"] 
     name_JMSName = j_JMSName.value 
     des_name = JMSProvider.attributes["description"] 
     description_value = des_name.value 
     print "\n ID of JMS is: %s JMS Name: %s Description : %s " %(name_id,name_JMSName, description_value) 
    except KeyError: 
     continue 

except IOError: 
print ('\n\n Resources.xml file not present at Cell level \n\n') 

XML如下

<?xml version="1.0" encoding="UTF-8"?> 
    <xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:resources.jms="http://www.ibm.com/websphere/appserver/schemas/5.0/resources.jms.xmi" xmlns:resources.j2c="http://www.ibm.com/websphere/appserver/schemas/5.0/resources.j2c.xmi" xmlns:resources="http://www.ibm.com/websphere/appserver/schemas/5.0/resources.xmi" xmlns:resources.mail="http://www.ibm.com/websphere/appserver/schemas/5.0/resources.mail.xmi" xmlns:resources.url="http://www.ibm.com/websphere/appserver/schemas/5.0/resources.url.xmi"> 
     <xmi:Documentation> 
     <contact>[email protected]</contact> 
     </xmi:Documentation> 
     <resources.jms:JMSProvider xmi:id="builtin_jmsprovider" name="WebSphere JMS Provider" description="Built-in WebSphere JMS Provider" externalInitialContextFactory="" externalProviderURL=""/> 
     <resources.jms:JMSProvider xmi:id="builtin_mqprovider" name="WebSphere MQ JMS Provider" externalInitialContextFactory="" externalProviderURL=""> 
     <classpath>${MQJMS_LIB_ROOT}</classpath> 
     <nativepath>${MQJMS_LIB_ROOT}</nativepath> 
     </resources.jms:JMSProvider> 
     <resources.j2c:J2CResourceAdapter xmi:id="builtin_rra" name="WebSphere Relational Resource Adapter" description="Built-in Relational Resource Adapter for Container Managed Persistence" archivePath="${WAS_LIBS_DIR}/rsadapter.rar"> 
     <propertySet xmi:id="J2EEResourcePropertySet_8"> 
      <resourceProperties xmi:id="J2EEResourceProperty_31" name="TransactionResourceRegistration" type="java.lang.String" value="dynamic" description="Type of transaction resource registration (enlistment). Valid values are either &#34;static&#34; (immediate) or &#34;dynamic&#34; (deferred)."/> 
      <resourceProperties xmi:id="J2EEResourceProperty_32" name="InactiveConnectionSupport" type="java.lang.Boolean" value="true" description="Specify whether connection handles support implicit reactivation. (Smart Handle support). Value may be &#34;true&#34; or &#34;false&#34;."/> 
     </propertySet> 
     </resources.j2c:J2CResourceAdapter> 
     <resources.mail:MailProvider xmi:id="builtin_mailprovider" name="Built-in Mail Provider" description="The built-in mail provider"> 
     <protocolProviders xmi:id="builtin_smtp" protocol="smtp" classname="com.sun.mail.smtp.SMTPTransport" type="TRANSPORT"/> 
     <protocolProviders xmi:id="builtin_pop3" protocol="pop3" classname="com.sun.mail.pop3.POP3Store" type="STORE"/> 
     <protocolProviders xmi:id="builtin_imap" protocol="imap" classname="com.sun.mail.imap.IMAPStore" type="STORE"/> 
     </resources.mail:MailProvider> 
     <resources.url:URLProvider xmi:id="URLProvider_1" name="Default URL Provider" streamHandlerClassName="unused" protocol="unused"/> 
    </xmi:XMI> 

回答

0

您在XML有namespacesgetElementsByTagName(tagname)在这些情况下无法正常工作。为了使用标签名称获取元素,您必须使用getElementsByTagNameNS(namespace, tag)以及适当的名称空间,您将获得正确的搜索结果。

例如:

document.getElementsByTagNameNS(resources.jms, "JMSProvider") 

等剩余搜索。

你可以在Element namespaces search的地址查看更多关于

的信息