1

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

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

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

从一个元素开始,我们称之为 ListE。调用 API,解析 XML,从 ElementTree 中获取根元素。将根元素作为子元素添加到 ListE 中。再次调用 API,然后重新开始。最后 ListE 应该是一个元素,其子元素是每个 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”'之间没有空格或返回。建议?

4

1 回答 1

3

问题在这里:

historyE = ET.Element('historical data')

你不应该使用空格。正如维基百科上的总结:

元素标签区分大小写;开始和结束标签必须完全匹配。标签名称不能包含任何字符 !"#$%&'()*+,/;<=>?@[]^`{|}~,也不能包含空格字符,并且不能以 -、. 或一个数字。

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

于 2013-01-05T02:33:03.423 回答