Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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解析此xml?_Python_Xml_Lxml - Fatal编程技术网

如何使用python解析此xml?

如何使用python解析此xml?,python,xml,lxml,Python,Xml,Lxml,我尝试了很多方法,但仍然无法从中提取数据 <?xml version="1.0" encoding="UTF-8"?><cwbopendata xmlns="urn:cwb:gov:tw:cwbcommon:0.1"> <identifier>CWB_ANNUAL_DATA_20161017134902</identifier> <sender>weather@cwb.gov.tw</sender> <sent&

我尝试了很多方法,但仍然无法从中提取数据

<?xml version="1.0" encoding="UTF-8"?><cwbopendata xmlns="urn:cwb:gov:tw:cwbcommon:0.1">
 <identifier>CWB_ANNUAL_DATA_20161017134902</identifier>
 <sender>weather@cwb.gov.tw</sender>
 <sent>2016-10-17 13:51+08:00</sent>
 <status>Actual</status>
 <msgType>Issue</msgType>
 <dataid>CWB_B0024-002</dataid>
 <scope>Public</scope>
 <dataset>
  <location>
   <locationName>BANQIAO,板橋</locationName>
   <stationId>466880</stationId>
   <weatherElement> 
    <elementName>逐時觀測</elementName>
    <time>
     <obsTime>2015-10-17 01:00</obsTime>
     <weatherElement>
      <elementName>測站氣壓</elementName>
      <elementValue>
       <value>1012.9</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>溫度</elementName>
      <elementValue>
       <value>23.2</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>相對濕度</elementName>
      <elementValue>
       <value>68</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>風速</elementName>
      <elementValue>
       <value>3.9</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>風向</elementName>
      <elementValue>
       <value>東北東,ENE</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>降水量</elementName>
      <elementValue>
       <value>0.0</value>
      </elementValue>
     </weatherElement>
    </time>
    <time>
     <obsTime>2015-10-17 02:00</obsTime>
     <weatherElement>
      <elementName>測站氣壓</elementName>
      <elementValue>
       <value>1012.7</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>溫度</elementName>
      <elementValue>
       <value>22.9</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>相對濕度</elementName>
      <elementValue>
       <value>69</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>風速</elementName>
      <elementValue>
       <value>3.3</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>風向</elementName>
      <elementValue>
       <value>東北東,ENE</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>降水量</elementName>
      <elementValue>
       <value>0.0</value>
      </elementValue>
     </weatherElement>
    </time>
    <time>
     <obsTime>2015-10-17 03:00</obsTime>
     <weatherElement>
      <elementName>測站氣壓</elementName>
      <elementValue>
       <value>1012.5</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>溫度</elementName>
      <elementValue>
       <value>22.8</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>相對濕度</elementName>
      <elementValue>
       <value>70</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>風速</elementName>
      <elementValue>
       <value>3.7</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>風向</elementName>
      <elementValue>
       <value>東北東,ENE</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>降水量</elementName>
      <elementValue>
       <value>0.0</value>
      </elementValue>
     </weatherElement>
    </time>
    <time>
     <obsTime>2015-10-17 04:00</obsTime>
     <weatherElement>
      <elementName>測站氣壓</elementName>
      <elementValue>
       <value>1012.4</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>溫度</elementName>
      <elementValue>
       <value>22.7</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>相對濕度</elementName>
      <elementValue>
       <value>70</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>風速</elementName>
      <elementValue>
       <value>3.1</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>風向</elementName>
      <elementValue>
       <value>東北東,ENE</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>降水量</elementName>
      <elementValue>
       <value>0.0</value>
      </elementValue>
     </weatherElement>
    </time>
    <time>
     <obsTime>2015-10-17 05:00</obsTime>
     <weatherElement>
      <elementName>測站氣壓</elementName>
      <elementValue>
       <value>1012.6</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>溫度</elementName>
      <elementValue>
       <value>22.6</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>相對濕度</elementName>
      <elementValue>
       <value>71</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>風速</elementName>
      <elementValue>
       <value>2.2</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>風向</elementName>
      <elementValue>
       <value>東北東,ENE</value>
      </elementValue>
     </weatherElement>
     <weatherElement>
      <elementName>降水量</elementName>
      <elementValue>
       <value>0.0</value>
      </elementValue>
     </weatherElement>
    </time>
    <time>
此部分成功地从location和stationId提取数据

data=[]
for elt in root.dataset.location:
    el_data={}
    skip_fields=['{urn:cwb:gov:tw:cwbcommon:0.1}weatherElement']
    for child in elt.getchildren():
        if child.tag in skip_fields:
            continue
        el_data[child.tag]=child.text
    data.append(el_data)
这部分obsTime可以提取,但elmentName和elementValue不能从中提取

data=[]
for elt in root.dataset.location.weatherElement.time:
    el_data={}
    skip_field=['{urn:cwb:gov:tw:cwbcommon:0.1}time']
    for child in elt.getchildren():
        if child.tag in skip_field:
            continue
            el_data[child.tag]=child.text
        for descendent in child.getchildren():
            el_data[descendent.tag]=descendent.text
            for next_descendent in descendent.getchildren():
                el_data[next_descendent.tag]=next_descendent.text
    data.append(el_data)
我建议使用此类型的任务

您要做的是:

  • 从XML生成xsd架构文件(使用Visual Studio或)
  • 使用pyxb生成绑定类(请参阅文档中的)。对于xsd文件,命令是:
    python pyxbgen cwbopendata.xsd-m cwbopendata
  • 使用该方法可以使用生成的绑定类
生成的代码是干净的。例如,下面的示例打印天气观测的时间戳:

导入cwbopendata
导入pyxb
data=cwbopendata.CreateFromDocument(open('cwb_data_example.xml').read())
对于data.dataset.location.weatherElement.time中的t:

打印(t.obsTime)
有一行带有无效的结束标记:
1012.7
我认为这是我的错误,我已经纠正了它。
data=[]
for elt in root.dataset.location.weatherElement.time:
    el_data={}
    skip_field=['{urn:cwb:gov:tw:cwbcommon:0.1}time']
    for child in elt.getchildren():
        if child.tag in skip_field:
            continue
            el_data[child.tag]=child.text
        for descendent in child.getchildren():
            el_data[descendent.tag]=descendent.text
            for next_descendent in descendent.getchildren():
                el_data[next_descendent.tag]=next_descendent.text
    data.append(el_data)