Python和ElementTree:write()无法正常工作

时间:2013-01-05 01:16:29

标签: python elementtree

第一个问题。如果我搞砸了,请告诉我。

好的,我需要做的是以下内容。我正在尝试使用Python从API获取一些数据。 API以XML格式将其发送给我。我正在尝试使用ElementTree来解析它。

现在,每次我从API请求信息时,都会有所不同。我想构建一个我得到的所有数据的列表。我可以使用Python的列表,但由于我想将它保存到文件末尾,我想 - 为什么不使用ElementTree呢。

从Element开始,我们称之为ListE。调用API,解析XML,从ElementTree获取根元素。将根元素作为子元素添加到ListE中。再次调用API,并全部完成。最后,ListE应该是一个Element,其子元素是每个API调用的结果。并且所有内容的结束只是将ListE包装到ElementTree中以便使用ElementTree write()函数。以下是代码。

import xml.etree.ElementTree as ET

url = "http://http://api.intrade.com/jsp/XML/MarketData/ContractBookXML.jsp?id=769355"

try:
    returnurl=urlopen(url)
except IOError:
    exit()

tree = ET.parse(returnurl)
root = tree.getroot()

print "root tag and attrib: ",root.tag, root.attrib

historyE = ET.Element('historical data')
historyE.append(root)
historyE.append(root)

historyET = ET.ElementTree(historyE)
historyET.write('output.xml',"UTF-8")

程序不会返回任何错误。问题是当我要求浏览器打开它时,它声称语法错误。用记事本打开文件就是我找到的:

<?xml version='1.0' encoding='UTF-8'?>
<historical data><ContractBookInfo lastUpdateTime="0">
   <contractInfo conID="769355" expiryPrice="100.0" expiryTime="1357334563000" state="S" vol="712" />
</ContractBookInfo><ContractBookInfo lastUpdateTime="0">
   <contractInfo conID="769355" expiryPrice="100.0" expiryTime="1357334563000" state="S" vol="712" />
</ContractBookInfo></historical data>

我认为语法错误的原因是'历史数据'和'ContractBookInfo lastUpdateTime =“0”'之间没有空格或回报。建议?

1 个答案:

答案 0 :(得分:3)

问题在于:

historyE = ET.Element('historical data')

你不应该使用空格。如Wikipedia所述:

  

元素标签区分大小写;开头和结尾标签必须   完全匹配。标记名称不能包含任何字符   !“#$%&amp;'()* +,/;&lt; =&gt;?@ [] ^`{|}〜,也不是空格字符,无法启动   用 - ,.或数字数字。

有关详细信息,请参阅XML规范的this section(“名称中允许使用几乎所有字符,除非那些字符可以或者可以合理地用作分隔符。”)