Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用ElementTree从XML提取数据时遇到的问题_Python_Xml_Api_Rest_Elementtree - Fatal编程技术网

Python 使用ElementTree从XML提取数据时遇到的问题

Python 使用ElementTree从XML提取数据时遇到的问题,python,xml,api,rest,elementtree,Python,Xml,Api,Rest,Elementtree,我不知道如何从下面的XML文档中提取数据 我已经通过下载了一个XML文档 它检索并保存如下所示的XML文档(显示前37行): 它返回一个空列表[]。我想我可以访问这样的数据e=tree.findall('message:GenericData/message:DataSet/generic:Series/generic:Obs/generic:obsdimmension value'),但似乎不是这样做的方法 我做错了什么?您需要传递名称空间参数 >>> import xml.

我不知道如何从下面的XML文档中提取数据

我已经通过下载了一个XML文档

它检索并保存如下所示的XML文档(显示前37行):

它返回一个空列表
[]
。我想我可以访问这样的数据
e=tree.findall('message:GenericData/message:DataSet/generic:Series/generic:Obs/generic:obsdimmension value')
,但似乎不是这样做的方法


我做错了什么?

您需要传递
名称空间
参数

>>> import xml.etree.ElementTree as ET
>>> tree = ET.parse('trial_savename.xml')
>>> ns = {'generic': "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic" }
>>> dimensions = tree.findall('.//generic:ObsDimension', namespaces=ns)
>>> values = [dim.get('value') for dim in dimensions]
>>> values[:5]
['2000-01-03', '2000-01-04', '2000-01-05', '2000-01-06', '2000-01-07']
如果使用,则可以使用
nsmap
属性,并且:

<?xml version="1.0" encoding="UTF-8"?><message:GenericData xmlns:message="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message" xmlns:common="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:generic="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic" xsi:schemaLocation="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message https://sdw-wsrest.ecb.europa.eu:443/vocabulary/sdmx/2_1/SDMXMessage.xsd http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common https://sdw-wsrest.ecb.europa.eu:443/vocabulary/sdmx/2_1/SDMXCommon.xsd http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic https://sdw-wsrest.ecb.europa.eu:443/vocabulary/sdmx/2_1/SDMXDataGeneric.xsd">
<message:Header>
<message:ID>781631bf-c21e-4c88-9657-ae03c858b917</message:ID>
<message:Test>false</message:Test>
<message:Prepared>2015-12-11T16:56:20.723+01:00</message:Prepared>
<message:Sender id="ECB"/>
<message:Structure structureID="ECB_EXR1" dimensionAtObservation="TIME_PERIOD">
<common:Structure>
<URN>urn:sdmx:org.sdmx.infomodel.datastructure.DataStructure=ECB:ECB_EXR1(1.0)</URN>
</common:Structure>
</message:Structure>
</message:Header>
<message:DataSet action="Replace" validFromDate="2015-12-11T16:56:20.723+01:00" structureRef="ECB_EXR1">
<generic:Series>
<generic:SeriesKey>
<generic:Value id="FREQ" value="D"/>
<generic:Value id="CURRENCY" value="USD"/>
<generic:Value id="CURRENCY_DENOM" value="EUR"/>
<generic:Value id="EXR_TYPE" value="SP00"/>
<generic:Value id="EXR_SUFFIX" value="A"/>
</generic:SeriesKey>
<generic:Attributes>
<generic:Value id="SOURCE_AGENCY" value="4F0"/>
<generic:Value id="COLLECTION" value="A"/>
<generic:Value id="DECIMALS" value="4"/>
<generic:Value id="TITLE_COMPL" value="ECB reference exchange rate, US dollar/Euro, 2:15 pm (C.E.T.)"/>
<generic:Value id="UNIT" value="USD"/>
<generic:Value id="TITLE" value="US dollar/Euro"/>
<generic:Value id="UNIT_MULT" value="0"/>
</generic:Attributes>
<generic:Obs>
<generic:ObsDimension value="2000-01-03"/>
<generic:ObsValue value="1.009"/>
<generic:Attributes>
<generic:Value id="OBS_STATUS" value="A"/>
</generic:Attributes>
</generic:Obs>
import xml.etree.ElementTree as ET
tree = ET.parse('trial_savename.xml')
e = tree.findall('message:GenericData')
>>> import xml.etree.ElementTree as ET
>>> tree = ET.parse('trial_savename.xml')
>>> ns = {'generic': "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic" }
>>> dimensions = tree.findall('.//generic:ObsDimension', namespaces=ns)
>>> values = [dim.get('value') for dim in dimensions]
>>> values[:5]
['2000-01-03', '2000-01-04', '2000-01-05', '2000-01-06', '2000-01-07']
>>> import lxml.etree as ET
>>> tree = ET.parse('trial_savename.xml')
>>> values = tree.xpath('.//generic:ObsDimension/@value', namespaces=tree.getroot().nsmap)
>>> values[:5]
['2000-01-03', '2000-01-04', '2000-01-05', '2000-01-06', '2000-01-07']