我正在用Python生成一些XML代码。此代码计算语料库中一个单词的出现数,并将该单词与一个数字(概率分布)相匹配。
这里有一个XML示例:
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<Durapipe type="int">1</Durapipe>
<EXPLAIN type="int">2</EXPLAIN>
<woods type="int">2</woods>
<hanging type="int">3</hanging>
<hastily type="int">2</hastily>
<key type="int" name="27p">1</key>
<localized type="int">1</localized>
<Schuster type="int">5</Schuster>
<regularize type="int">1</regularize>
....
</root>下面是我用来生成以下内容的Python:
from __future__ import unicode_literals
import nltk.corpus
from nltk import FreqDist
import dicttoxml
#corpus
words = [w.decode('utf-8', errors='replace') for w in nltk.corpus.reuters.words()]
fd = FreqDist(words)
afd = dict(fd)
# special key for sum
afd['__sum__']=fd.N()
xml = dicttoxml.dicttoxml(afd)
f=open('frequencies.xml', 'w')
f.write(xml)
f.close()后来,我通过XStream运行XML,将其转换为Java。不幸的是,XStream不能转换它,因为在XML代码中出现了'key‘这个词。我找不到我生命中的错误。XML错误如下所示:
致命错误frequencies.xml:1:27582:元素类型"key“必须后面跟着属性规范">”或"/>“。线程"main“com.thoughtworks.xstream.io.StreamException::Element type "key”中的异常必须后面跟着属性规范">“或"/>”。
我有三个问题:这个错误是什么?如何修复XML?如何修改Python代码以生成正确的XML?
很抱歉提出了一个冗长的问题,但我对Python和XML都缺乏经验。你所能给予的任何帮助都将不胜感激。提前感谢!
发布于 2014-08-03 14:38:09
nltk.corpus.reuters.words()返回一个包含一些不能有效的XML元素名称的“单词”的列表,例如.'"。
当dicttoxml()在afd字典中遇到这样的键时,它会生成一个名为" key“的元素,并生成一个包含原始(无效)名称的属性name。
<key type="int" name=".'"">1</key>显然,这是无效的XML,所有XML解析器都应该(正确地)抱怨它。xmllint是这样做的,你已经发现XStream也这么做了。dicttoxml()不会用"替换双引号(")等字符。要解决这个问题,您可以在运行xml_escape()之前在键上调用dicttoxml() (请参阅下面的dict理解):
from __future__ import unicode_literals
import nltk.corpus
from nltk import FreqDist
from dicttoxml import dicttoxml, xml_escape
#corpus
words = [w.decode('utf-8', errors='replace') for w in nltk.corpus.reuters.words()]
fd = FreqDist(words)
afd = {xml_escape(k):v for k,v in fd.items()}
# special key for sum
afd['__sum__']=fd.N()
xml = dicttoxml(afd)
f=open('frequencies.xml', 'w')
f.write(xml)
f.close()https://stackoverflow.com/questions/25104385
复制相似问题