2017-02-20 36 views
0

Я пытаюсь прочитать XML-запрос SOAP из журналов и выполнить некоторую проверку, извлекая данные, но без успеха.Извлечение данных из XML с использованием Python с использованием пространства имен

Вот XML я пытаюсь читать:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soapenv:Body> 
    <createOrder xmlns="http://services.xxx.xxx.xxx.com"> 
    <createOrderRequest> 
    <ns1:order xmlns:ns1="http://beans.xxx.xxx.xxx.com/xsd"> 
    <ns1:customer> 
     <ns1:billingAddress> 
     <ns1:addressLine1>my home address</ns1:addressLine1> 
     <ns1:addressLine2></ns1:addressLine2> 
     <ns1:addressType>B</ns1:addressType> 
     <ns1:city>cityofmine</ns1:city> 
     <ns1:countryCode>countrycode</ns1:countryCode> 
     <ns1:firstName>Jo</ns1:firstName> 
     <ns1:lastName>Sm</ns1:lastName> 
     <ns1:state>IL</ns1:state> 
     <ns1:zipCode>60135</ns1:zipCode> 
     </ns1:billingAddress> 
     <ns1:customerReferenceId>[email protected]</ns1:customerReferenceId> 
    </ns1:customer> 
    <ns1:items> 
     <ns1:addressKey>99999</ns1:addressKey> 
     <ns1:orderItemId>xxxxx1231</ns1:orderItemId> 
    </ns1:items> 
    </ns1:order> 
    </createOrderRequest> 
    </createOrder> 
    </soapenv:Body> 
</soapenv:Envelope> 

Вот код, который я пытался с, но я не могу найти элементы.

import xml.etree.ElementTree as ET 

def read_create_order(): 
    tree = ET.parse('create_ord.xml') 
    root = tree.getroot() 
    print(root.tag) 
    name_space = {'ns1':'http://beans.xxx.xxx.xxx.com/xsd'} 
    for item in tree.findall('items', namespaces=name_space): 
     print(item) 
    for item in root.findall('items', namespaces=name_space): 
     print(item) 

ответ

0

Наконец это работало для me.But, если есть какие-то более эффективные решения, где я хотел бы получить доступ к тег по имени, так что я не в цикле

ns = etree.FunctionNamespace('http://beans.xxx.xxx.xxx.com/xsd') 
    ns.prefix = "ns1" 
    ldoc = etree.parse('create_ord.xml') 
    for sub_elements in ldoc.xpath('.//ns1:order/ns1:customer/ns1:billingAddress'): 
    for element in sub_elements: 
     print(element.text) 
+1

* "Я хотел бы для доступа к тегу по имени, так что мне не нужно зацикливать «*, к какому конкретному тегу вы пытаетесь получить доступ? – mzjn

+0

@mzjn Я могу получить доступ к определенному полю таким образом прямо сейчас 'ldoc.xpath ('.// ​​ns1: order/ns1: customer')'. Но я точно имел в виду это ... в примере кода выше 'для sub_elements в ldoc.xpath ('.// ​​ns1: order/ns1: customer/ns1: billingAddress'):' однажды я в родительском 'billingAddress', Я хочу знать, могу ли я сделать что-то вроде '.get ('ns1addressLine2')' – VBJ