我正在使用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 Map。不幸的是,由于XML代码中的错误,XStream无法转换它,因为“key”这个词出现了。我找不到生活中的错误。 XML Error看起来像这样:
[致命错误] frequency.xml:1:27582:元素类型“key”必须后跟属性规范“&gt;”或“/&gt;”。 线程“main”中的异常com.thoughtworks.xstream.io.StreamException ::元素类型“key”必须后跟属性规范“&gt;”或“/&gt;”。
所以我在这里有三个问题:这个错误是什么?我该如何修复XML?如何修改Python代码以生成正确的XML?
很抱歉这个冗长的问题,但我对Python和XML都缺乏经验。您可以给予任何帮助,我将不胜感激。提前谢谢!
答案 0 :(得分:4)
nltk.corpus.reuters.words()
返回一个包含一些&#34;单词的列表&#34;它不能是有效的XML元素名称,例如.'"
。
当dicttoxml()
在afd
字典中遇到这样的密钥时,它会生成一个名为&#34; key&#34;的元素。并且包含原始(无效)名称的属性name
,例如
<key type="int" name=".'"">1</key>
显然,这是无效的XML,并且所有XML解析器都应该(正确地)抱怨它。 xmllint
确实发现了XStream也是如此。 dicttoxml()
并未将双引号("
)等字符替换为"
。要解决此问题,您可以在运行xml_escape()
之前调用密钥上的dicttoxml()
(请参阅下面的dict comprehension):
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()