首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python生成的XML中的错误

Python生成的XML中的错误
EN

Stack Overflow用户
提问于 2014-08-03 11:54:15
回答 1查看 318关注 0票数 1

我正在用Python生成一些XML代码。此代码计算语料库中一个单词的出现数,并将该单词与一个数字(概率分布)相匹配。

这里有一个XML示例:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
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都缺乏经验。你所能给予的任何帮助都将不胜感激。提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-03 14:38:09

nltk.corpus.reuters.words()返回一个包含一些不能有效的XML元素名称的“单词”的列表,例如.'"

dicttoxml()afd字典中遇到这样的键时,它会生成一个名为" key“的元素,并生成一个包含原始(无效)名称的属性name

代码语言:javascript
复制
<key type="int" name=".'"">1</key>

显然,这是无效的XML,所有XML解析器都应该(正确地)抱怨它。xmllint是这样做的,你已经发现XStream也这么做了。dicttoxml()不会用&quot;替换双引号(")等字符。要解决这个问题,您可以在运行xml_escape()之前在键上调用dicttoxml() (请参阅下面的dict理解):

代码语言:javascript
复制
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()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25104385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档