草庐IT

python - 通过元素树创建 xml 后解析时出现元素树错误

coder 2024-07-04 原文

为什么这段代码创建的xml无法被python解析或读取?

我有一段代码正在编写一个 xml 文件:

idlist = list(set([d['type'] for d in List]))                   ##create list of all ID numbers
idlist.sort()
root = ET.Element("MarketData")
for i in idlist:                                                ##iterate over every ID number
    doc = ET.SubElement(root, 'Item', typeID=str(i))            ##create child for current ID number
    tList = list(filter(lambda x: x['type'] == i, List))        ##make a list of all orders for current ID
    sList = list(filter(lambda x: x['buy'] == False, tList))    ##create list of only sell orders
    bList = list(filter(lambda x: x['buy'] == True, tList))     ##create list of only by orders
    spl = list([d['price'] for d in sList])                     ##create list of sell prices
    bpl = list([d['price'] for d in bList])                     ##create list of buy prices
    if not spl:                                                 ##null case
        spl = [-1]
    if not bpl:                                                 ##null case
        bpl = [-1]
    sp = min(spl)                                               ##find min sell price
    bp = max(bpl)                                               ##find max buy price
    ET.SubElement(doc, 'Sell Price').text = str(sp)             ##write sell price to child as string under new sub-element
    ET.SubElement(doc, 'Buy Price').text = str(bp)              ##write buy price to branch as string under new sub-element
tree = ET.ElementTree(root)
tree.write("MarketData.xml")                                    ##write xml tree to final xml file

它执行得很好,我的测试代码和相同的 xml 逻辑写了一个完全可读的文件,但是当我使用这段代码创建一个文件时,它是不可读的,不能被 ElementTree 解析。

从 python 我得到:“xml.etree.ElementTree.ParseError:格式不正确(无效标记):第 1 行,第 41 列”。

从 Firefox 我得到:“第 1 行第 42 列错误:属性价格的规范授权值”。

xml 的第一个 chuck(当通过 np++ 打开时)是:

<MarketData><Item typeID="18"><Sell Price>64.92</Sell Price><Buy Price>53.31</Buy Price></Item><Item typeID="19"><Sell Price>36999.99</Sell Price><Buy Price>3502.03</Buy Price></Item>

我完全不知所措......有什么建议吗?

注意:我不是程序员,我在玩游戏时这样做是为了好玩,所以请不要为了任何事情而对我太过苛刻......

最佳答案

元素名称中不能包含空格,例如 Sell Price .开始标记,例如 <Sell Price> (或像 <Sell Price /> 这样的空元素标签)不完整。它被解释为元素 Sell具有属性 Price没有分配给它的值。这是非法的。

不幸的是,ElementTree 允许您创建显示此错误的错误输出。这是一个小演示(使用 Python 2.7.13 测试):

import xml.etree.ElementTree as ET

root = ET.Element("root")
ET.SubElement(root, 'Sell Price')
print ET.tostring(root)

这个程序输出 <root><Sell Price /></root> , 这是病式的。

如果您使用 lxml而不是 ElementTree,你会得到正确的行为(抛出异常):

from lxml import etree as ET

root = ET.Element("root")
ET.SubElement(root, 'Sell Price')
print ET.tostring(root)

结果:

Traceback (most recent call last):
  File "error.py", line 6, in <module>
    ET.SubElement(root, 'Sell Price')
  File "src\lxml\lxml.etree.pyx", line 3112, in lxml.etree.SubElement (src\lxml\lxml.etree.c:75599)
  File "src\lxml\apihelpers.pxi", line 183, in lxml.etree._makeSubElement (src\lxml\lxml.etree.c:16962)
  File "src\lxml\apihelpers.pxi", line 1626, in lxml.etree._tagValidOrRaise (src\lxml\lxml.etree.c:32556)
ValueError: Invalid tag name u'Sell Price'

关于python - 通过元素树创建 xml 后解析时出现元素树错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41413243/

有关python - 通过元素树创建 xml 后解析时出现元素树错误的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  4. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  5. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  6. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  7. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  8. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  9. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  10. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

随机推荐