1

初めてのポスター。私はできるだけ具体的にしようとします。質問を絞り込むために、xml ドキュメントがどのように見えるかを制御することはできません (パーサーがドキュメントをそのまま処理できるようにする必要があります)。ファイルは整形式です (ドキュメントが整形式でないことを私に伝えるものは何もなく、そうでない理由についても理由が​​わかりません)。プログラムからエラー (またはパーサーからの例外) が返されません。ともかく...

xml ファイル (utf-8 エンコーディング) を sax パーサーにフィードし、必要なタグ間の情報 (必要な場合は属性も) を引き出しています。このドキュメントには、多数のネストされたタグ (および同じ名前のタグがいくつかあります) があります。必要な情報が保存されているドキュメント内の領域に確実に到達するために、一連のフラグを使用して設定/リセットします (開始タグが表示されたときに設定し、終了タグが表示されたときにリセットします) )。特定の条件が満たされた場合 (設定されているフラグに応じて)、コンテンツ ハンドラーの content 関数で、オブジェクト内に保持されているリストに情報を追加します。コンテンツを変更せず、オブジェクトのコンテンツをファイルに書き込みます。

コンテンツを読み取るとき、sax パーサーはエスケープされた文字を置き換えます。したがって、この:

<name>D &amp; C YELLOW NO. 10</name>

これになるはずです:

D & C YELLOW NO. 10

しかし、ファイル内でコンテンツがコンソールに出力されると (コンテンツ ハンドラの文字関数で)、文字列は次のようになります。

D 

その D の後には、ファイルとコンソールの印刷でスペースが続きます。私の質問は、これはある種のバグですか、それとも何か不足していますか?

編集: 関連するコードが提供されています。xmlFile は、ファイル名を保持する単なる文字列です (つまり、test.xml のように)。

XMLContentHandler=NIHXMLparser.XMLContentHandler()
xml.sax.parse(xmlFile,XMLContentHandler)

ファイルの内容を変更するのではなく、プルするだけなので、パーサーのスケルトンを提供します。

class XMLContentHandler(xml.sax.ContentHandler):
    def __init__(self):
        #initializing some flags to false
    def startElement(self, name, attrs):
        #set flags according to what tag
        #names appear.
    def characters(self,content):
        #depending on certain flags being set
        #I just pull out the info between there.
        #No modifications made. The sax parser
        #parses the content variable on its own.
        #I have no control over what it sends back.
    def endElement(self,name):
        #resets flags here.
4

1 に答える 1

3

はい、何かが欠けています。xml.sax.ContentHandler.charactersドキュメントから:

パーサーはこのメソッドを呼び出して、文字データの各チャンクを報告します。SAX パーサーは、連続するすべての文字データを 1 つのチャンクで返すか、複数のチャンクに分割するか...


次のように、 でテキストを収集して で出力してみて.characters()ください。endElement

#! /usr/bin/python

import xml
import xml.sax
import StringIO

class NIHXMLparser:
  class XMLContentHandler(xml.sax.ContentHandler):
    def __init__(self):
        self.name = False
        self.content = ''
    def startElement(self, name, attrs):
        if name == 'name':
            self.name = True
    def characters(self,content):
        self.content += content
    def endElement(self,name):
        if self.name and name == 'name':
            self.name = False
            print self.content
            self.content = ''

xmlText = r'<name>D &amp; C YELLOW NO. 10</name>'
xmlFile = StringIO.StringIO(xmlText)

XMLContentHandler=NIHXMLparser.XMLContentHandler()
xml.sax.parse(xmlFile,XMLContentHandler)
于 2013-11-05T15:57:17.363 に答える