1

XMLReaderを備えたSAXParserがあります。

SAXParserFactory saxPF = SAXParserFactory.newInstance();
SAXParser sp = saxPF .newSAXParser();
XMLReader xmlR = sp.getXMLReader();
MyHandler myHandler = new MyHandler();
xmlR .setContentHandler(myHandler );

私のハンドラーコードは、startElementとendElementを使用して、タグ内にあることを検出します。これは、ブール値を設定し、characters()を使用して値を取得することによって行われます。

public void startElement(String namespaceURI, 
    String localName, String qName, Attributes atts) throws SAXException {
    if (localName.equals("myTag")) this.in_myTag = true;
}

public void characters(char ch[], int start, int length) {
            if(in_myTag )  { c.setMyTag(new String(ch, start, length));
}

問題は、「A&B Value」というタグがあり、「A」と「&」、「B」と「Value」のcharacters()に通知していることです。したがって、setMyTagの最終的な値は「Value」です。

<myTag>A & B value</myTag>

http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html

4

2 に答える 2

3
<myTag>A & B value</myTag>

(これは XML ではありません。整形式であることを意味A &amp; B valueしていると思います。)

characters()一般に、ハンドラーが要素ごとに 1 回だけ呼び出されることを保証することはできません。要素にテキスト コンテンツがない場合は、まったく呼び出されません。エンティティ参照があるか、テキストが非常に長い場合、複数回呼び出される可能性があります。もちろん、そこにあるコメント、PI、またはその他の要素には、間違いなく複数の呼び出しが必要です。

事前定義されたエンティティ参照&amp;がコンテンツ ハンドラーへの個別のコールバックを引き起こすことは珍しいことですが、仕様には、何らかの理由 (または理由なし) でいつでも発生できないと言うものは何もありません。特に:

SAX パーサーは、連続するすべての文字データを 1 つのチャンクで返すか、複数のチャンクに分割する場合があります。

したがって、SAX ハンドラーは、単一のコールバックendElementからコンテンツを設定するのではなく、送信されたすべてのテキスト コンテンツを収集し、発生時にそれらを結合する必要があります。characters

于 2010-07-11T13:56:18.440 に答える
0

Android API 1.5 で SAX パーサー (javax.xml.parsers.SAXParser) を使用して引用符を解析する際のトラブルを見てください。

ちなみに & は間違った XML 文字です。 & のはずです。

于 2010-07-11T13:53:56.197 に答える