2014-04-14 116 views
0

下面顯示的Сode工作正常,但問題是我需要手動設置名稱空間,如d:。是否有可能以某種方式搜索忽略此名稱的元素,如dom.getElementsByTagName('Scopes')如何搜索python中的XML元素?

def parseSoapBody(soap_data): 
    dom = parseString(soap_data) 

    return { 
     'scopes': dom.getElementsByTagName('d:Scopes')[0].firstChild.nodeValue, 
     'address': dom.getElementsByTagName('d:XAddrs')[0].firstChild.nodeValue, 
    } 

回答

1

由於你的代碼使用parseString和getElementsByTagName,我假設你正在使用minidom。在這種情況下,嘗試:

dom.getElementsByTagNameNS('*', 'Scopes') 

它不會在the docs這麼說,但如果你在xml/dom/minidom.py的源代碼看,你會看到getElementsByTagNameNS電話_get_elements_by_tagName_ns_helper這是這樣定義的:

def _get_elements_by_tagName_ns_helper(parent, nsURI, localName, rc): 
    for node in parent.childNodes: 
     if node.nodeType == Node.ELEMENT_NODE: 
      if ((localName == "*" or node.localName == localName) and 
       (nsURI == "*" or node.namespaceURI == nsURI)): 
       rc.append(node) 
      _get_elements_by_tagName_ns_helper(node, nsURI, localName, rc) 
    return rc 

注意,當nsURI等於*,只有localName需要匹配。


例如,

import xml.dom.minidom as minidom 
content = '''<root xmlns:f="foo"><f:test/><f:test/></root>''' 
dom = minidom.parseString(content) 
for n in dom.getElementsByTagNameNS('*', 'test'): 
    print(n.toxml()) 
    # <f:test/> 
    # <f:test/>