繁体   English   中英

使用 python 中的命名空间解析 XML

Parse XML with namespaces in python

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我希望你做得很好。 我真的需要你的帮助,我最近一直在使用 XML 但我遇到了这个 XML 的命名空间,我不明白。 我想提取响应的值,但我不知道该怎么做。

这是 XML,我想提取“项目”中的值。

        <XMLRESPONSE>
            <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:wsNotes" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
                <SOAP-ENV:Body>
                    <ns1:GetPersonasResponse xmlns:ns1="wsNotes">
                        <return xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:registro[1]">
                            <item xsi:type="tns:registro">
                                <seguro xsi:type="xsd:string">0</seguro>
                                <cedula_pasaporte xsi:type="xsd:string">x-xxx-1454</cedula_pasaporte>
                                <nombre xsi:type="xsd:string">JUANITCO CARDENAS</nombre>
                                <razon_social xsi:type="xsd:string">GOOGLE</razon_social>
                                <patrono xsi:type="xsd:string">GOOGLE PA</patrono>
                                <ruc xsi:nil="true" xsi:type="xsd:string"/>
                                <direccion xsi:type="xsd:string">AVE. MEXICO Y CL. 33 LOCAL. 07</direccion>
                                <telefono1 xsi:type="xsd:int">2259444</telefono1>
                                <telefono2 xsi:nil="true" xsi:type="xsd:int"/>
                                <fecha xsi:type="xsd:string">1220</fecha>
                                <salario xsi:type="xsd:decimal">1000</salario>
                                <promedio_salarial xsi:type="xsd:string">1000</promedio_salarial>
                                <Seis_Meses_Mas xsi:type="xsd:string">Si</Seis_Meses_Mas>
                                <Cantidad_Meses xsi:type="xsd:int">15</Cantidad_Meses>
                                <Historial xsi:type="xsd:string">
                                            Fecha: 1220 Patrono: "APPTIVIDAD" Salario: 5500.00||
                                            Fecha: 1120 Patrono: "APPTIVIDAD" Salario: 5500.00||
                                            Fecha: 0920.0 Patrono: APPTIVIDAD Salario: 5500.00||
                                            Fecha: 0820 Patrono: APPTIVIDAD Salario: 5500.35||
                                            Fecha: 0720 Patrono: APPTIVIDAD Salario: 5500.20||
                                            Fecha: 0620 Patrono: APPTIVIDAD Salario: 5500.01||
                                            Fecha: 0420 Patrono: APPTIVIDAD Salario: 5500.22||
                                            Fecha: 0320 Patrono: APPTIVIDAD Salario: 5500.70||
                                            Fecha: 0120 Patrono: APPTIVIDAD Salario: 5500.97||
                                            Fecha: 1219 Patrono: APPTIVIDAD Salario: 5500.82||
                                            Fecha: 1119 Patrono: APPTIVIDAD Salario: 5500.33||
                                            Fecha: 0919 Patrono: APPTIVIDAD Salario: 5500.25|
                                </Historial>
                                <Total_Empleados xsi:type="xsd:int">20</Total_Empleados>
                            </item>
                        </return>
                    </ns1:GetPersonasResponse>
                </SOAP-ENV:Body>
            </SOAP-ENV:Envelope>
        </XMLRESPONSE>

我会应用一段代码来说明如何实现这一点。

谢谢

2 个回复

请注意,没有定义默认命名空间。 只有带有ns1SOAP-ENV等前缀的元素才在命名空间中。 item元素及其子元素不在任何命名空间中。

import xml.etree.ElementTree as ET

tree = ET.parse("test.xml")
item = tree.find(".//item")
for child in item:
    print(f"{child.tag}: {child.text}")

Output:

seguro: 0
cedula_pasaporte: x-xxx-1454
nombre: JUANITCO CARDENAS
razon_social: GOOGLE
patrono: GOOGLE PA
ruc: None
direccion: AVE. MEXICO Y CL. 33 LOCAL. 07
telefono1: 2259444
telefono2: None
fecha: 1220
salario: 1000
promedio_salarial: 1000
Seis_Meses_Mas: Si
Cantidad_Meses: 15
Historial: 
              Fecha: 1220 Patrono: "APPTIVIDAD" Salario: 5500.00||
              Fecha: 1120 Patrono: "APPTIVIDAD" Salario: 5500.00||
              Fecha: 0920.0 Patrono: APPTIVIDAD Salario: 5500.00||
              Fecha: 0820 Patrono: APPTIVIDAD Salario: 5500.35||
              Fecha: 0720 Patrono: APPTIVIDAD Salario: 5500.20||
              Fecha: 0620 Patrono: APPTIVIDAD Salario: 5500.01||
              Fecha: 0420 Patrono: APPTIVIDAD Salario: 5500.22||
              Fecha: 0320 Patrono: APPTIVIDAD Salario: 5500.70||
              Fecha: 0120 Patrono: APPTIVIDAD Salario: 5500.97||
              Fecha: 1219 Patrono: APPTIVIDAD Salario: 5500.82||
              Fecha: 1119 Patrono: APPTIVIDAD Salario: 5500.33||
              Fecha: 0919 Patrono: APPTIVIDAD Salario: 5500.25|
            
Total_Empleados: 20

这是我的解决方案,希望对您有所帮助。

所需库:beautifulsoup4 和 lxml。

代码:

from bs4 import BeautifulSoup 

# Reading the data inside the xml file
with open('yourFile.xml', 'r') as f:
    data = f.read() 

# Data parsing
bs_data = BeautifulSoup(data, 'xml')

item = bs_data.find("item",{"xsi:type":"tns:registro"})

for child in item:
    if child.name:
        print(f"Tag: {child.name}, Value:{child.next}")

OUTPUT:

Tag: cedula_pasaporte, Value:x-xxx-1454
Tag: nombre, Value:JUANITCO CARDENAS
Tag: razon_social, Value:GOOGLE
Tag: patrono, Value:GOOGLE PA
Tag: ruc, Value:

Tag: direccion, Value:AVE. MEXICO Y CL. 33 LOCAL. 07
Tag: telefono1, Value:2259444
Tag: telefono2, Value:

Tag: fecha, Value:1220
Tag: salario, Value:1000
Tag: promedio_salarial, Value:1000
Tag: Seis_Meses_Mas, Value:Si
Tag: Cantidad_Meses, Value:15
Tag: Historial, Value:
                                    Fecha: 1220 Patrono: "APPTIVIDAD" Salario: 5500.00||
                                    Fecha: 1120 Patrono: "APPTIVIDAD" Salario: 5500.00||
                                    Fecha: 0920.0 Patrono: APPTIVIDAD Salario: 5500.00||
                                    Fecha: 0820 Patrono: APPTIVIDAD Salario: 5500.35||
                                    Fecha: 0720 Patrono: APPTIVIDAD Salario: 5500.20||
                                    Fecha: 0620 Patrono: APPTIVIDAD Salario: 5500.01||
                                    Fecha: 0420 Patrono: APPTIVIDAD Salario: 5500.22||
                                    Fecha: 0320 Patrono: APPTIVIDAD Salario: 5500.70||
                                    Fecha: 0120 Patrono: APPTIVIDAD Salario: 5500.97||
                                    Fecha: 1219 Patrono: APPTIVIDAD Salario: 5500.82||
                                    Fecha: 1119 Patrono: APPTIVIDAD Salario: 5500.33||
                                    Fecha: 0919 Patrono: APPTIVIDAD Salario: 5500.25|
                        
Tag: Total_Empleados, Value:20

2 使用命名空间python3解析XML属性

我已经看过另一个有关通过“ ElementTree”在Python中使用名称空间解析XML的问题,并回顾了xml.etree.ElementTree文档。 我遇到的问题确实很相似,因此可以随时将其标记为重复,但我无法弄清楚。 我遇到的代码行是 我的代码如下: XML文件: ...

4 使用 Python 解析 XML,键值命名空间

我有一个从 Wordpress 下载的 XML 文件,其结构如下: 我的目标是查看所有country /地区键的 XML 文件并打印值。 我对 XML 库完全陌生,所以我正在寻找从这里获取它的地方。 这给我一个关于使用 wp 作为命名空间的错误,但我不确定 go 从这里到哪里我不清楚文档。 任何帮助 ...

5 python 用命名空间解析 XML?

Hellow i try to get xml with namespace in python URL: https://thbapp.thb.gov.tw/opendata/vd/one/VDLiveList.xml 如何获取指定VDID以下的所有数据,例如:VD-11-0020-002-0 ...

10 使用PHP解析XML和命名空间

这是我的XML: 我可以检索标题,链接,描述,pubDate等,但是无法到达pr:City或pr:State节点。 这可以访问城市名称,但是XML中并不总是有城市,因此增加计数器无效。 我只是想获取这些项目并显示它们(如果存在)。 这可能是一个简单的修复,但是我已经尝试了 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM