Python生成的XML出错

时间:2014-08-03 11:54:15

标签: java python xml xstream

我正在使用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都缺乏经验。您可以给予任何帮助,我将不胜感激。提前谢谢!

1 个答案:

答案 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()并未将双引号(")等字符替换为&quot;。要解决此问题,您可以在运行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()