好的,这是故事。我在xml文件中保存了大的浮点数。例如0.016780745002189634。数字在文件中正确保存,但是当我解析xml并且我读取它们时,其中一些(我用最大的数据)sax将它们分成两个不同的数字。喜欢:0.016780和745002189634。 我正在使用utf-8编码,如果它有事情要做,尝试iso同样的问题,不同的结果思想。 提前致谢
import xml.sax
from xml.sax.saxutils import XMLGenerator
from xml.sax.xmlreader import AttributesNSImpl
floattosave = 0.016780745002189634
def xmlindex():
logger = XMLGenerator(open('.\\a.xml','w'), 'utf-8')
logger.startDocument()
attrs = AttributesNSImpl({}, {})
logger.startElementNS((None,'Articles'), 'Articles', attrs)
attr_vals = {
(None, 'id'): str(1)
}
attr_qnames = {
(None, 'id'): 'id'
}
attrs = AttributesNSImpl(attr_vals, attr_qnames)
logger.startElementNS((None, 'Article'), u'Article', attrs)
attr_vals1 = {
(None, 'word'): 'lalala'
}
attr_qnames1 = {
(None, 'word'): 'word'}
attrs1 = AttributesNSImpl(attr_vals1, attr_qnames1)
logger.startElementNS((None, 'Lemma'), 'Lemma', attrs1)
logger.characters(repr(floattosave))
logger.endElementNS((None, 'Lemma'), 'Lemma')
logger.endElementNS((None, 'Article'), 'Article')
logger.endElementNS((None, 'Articles'), 'Articles')
logger.endDocument()
class myhandler(xml.sax.ContentHandler):
def __init__(self):
xml.sax.ContentHandler.__init__(self)
self.w = 0
self.child = 0
def startElement(self,name,attrs):
if name == 'Article':
self.child = 1
if name == 'Lemma':
self.child = 2
def characters(self, content):
if self.child == 2:
print content
a = float(content)
print a
xmlindex()
xml.sax.parse(open('.\\a.xml'),myhandler())
嗯,我做了类似的事情,但还有更多的元素。这是一个工作得很好,我猜其他地方是问题。我会调查一下。你帮助了很多tkx
答案 0 :(得分:2)
这与文本是否代表浮点数无关 - XML解析器不关心消费者认为文本的含义。
您的问题已记录在案here。
ContentHandler.characters(内容)
Receive notification of character data.
Parser将调用此方法来报告每个字符数据块。 SAX解析器可以在单个中返回所有连续的字符数据 大块,或者他们可能将它分成几个块; 然而,所有的 任何单个事件中的字符必须来自同一个外部实体 以便定位器提供有用的信息。
您有责任将块粘在一起。在startElement
处理程序中,初始化存储。在characters
处理程序中,将传入的块添加到存储中。在endElement
处理程序中,对存储执行某些操作。