2012-01-31 9 views
2

ここに話があります。大きな浮動小数点数をxmlファイルに保存します。例えば0.016780745002189634である。数値はファイルに正しく保存されますが、xmlを解析して読み込むと、それらのうちのいくつか(最大のものを押します)は、2つの異なる数値に分割されます。のような:0.016780と745002189634。 私はutf-8エンコーディングを使用しています。何かする必要がある場合は、別の結果を考えてiso同じ問題を試してみてください。事前に おかげでpython saxは大きな浮動小数点数を解析しています

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()) 

うーん、私はそのような多くのより多くの要素のために何かをすること。これは良い仕事です、私は別の場所に問題があると思います。私はそれを調べます。あなたは多くの手助けをしました

答えて

2

これは、テキストが浮動小数点数を表すかどうかとは関係ありません。つまり、XMLパーサは、消費者がテキストの意味を気にしません。

問題はhereと記載されています。

ContentHandler.characters(コンテンツ)

Receive notification of character data. 

パーサは、文字データの各チャンクを報告するには、このメソッドを呼び出します。 SAXパーサーは、すべての連続した文字データを単一の チャンクに返すか、または複数のチャンクに分割することができます。ただし、任意の単一イベント内の 文字のすべてが同じ外部エンティティ から来て、ロケータが有用な情報を提供する必要があります。

あなたはチャンクを一緒に接着する責任があります。 startElementハンドラで、ストレージを初期化します。 charactersハンドラで、着信チャンクをストレージに追加します。 endElementハンドラーで、ストレージで何かをしてください。

+0

問題を解決しました。ご協力いただきありがとうございます。 – user1181235

関連する問題