0

Web から取得したコンテンツを解析する必要があり、特殊文字が含まれている可能性があります。この場合、コンテンツ文字列は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<products>
  <product>
    <id>1</id>
    <price>2.14</price>
    <title>test &#382; test</title>

上記のコンテンツがメソッド characters() に渡されると、org.xml.sax.helpers.DefaultHandler から拡張されたクラスで次のようになります。

public class ProductsXMLHandler extends DefaultHandler {
...

@Override    
public void characters(char[] ch, int start, int length)
            throws SAXException {
        String elementValue = new String(ch, start, length);
    ...
}

test &#382; test配列が「test」、「」、「test」の 3 つの配列に分割されていることに気付きました。そのため、結果となる&#382;要素値が等しく test &#382; testありません。問題を解決する方法を知っている人はいますか?

ソース文字列を再コード化する必要がありますか:

 <?xml version="1.0" encoding="UTF-8"?>
<products>
  <product>
    <id>1</id>
    <price>2.14</price>
    <title>test &#382; test</title>

XML ハンドラ クラスに渡される前に?

ありがとうございました!

4

3 に答える 3

3

J on Skeet が answerで述べたように、characters複数回呼び出されます。あなたがすべきことは次のとおりです:

  • startTag、StringBuffer を作成し、探しているタグが正しいかどうかを (ブール値などで) 記録します。
  • characters、正しいタグにいる場合 (以前に設定されたブール値が true の場合)、文字を StringBuffer に入れます
  • endTag、正しいタグから抜け出している場合 (boolean を参照、前と同じこと)、StringBuffer のコンテンツを取得すると、ほら ! これが完全な文字列です。その後、StringBuffer を空にすることを忘れないでください。
于 2010-01-02T13:57:37.830 に答える
2

characters3回呼ばれてるってことですか?もしそうなら、あなたのコードがそれを処理するようにする必要があります - パーサーはこれを完全に自由に行うことができます。1 回の呼び出しですべての文字データを取得できると想定しないでください。

のドキュメントからDocumentHandler.characters():

SAX パーサーは、連続するすべての文字データを 1 つのチャンクで返すか、複数のチャンクに分割します。ただし、ロケータが有用な情報を提供できるように、単一のイベントのすべての文字は同じ外部エンティティから取得する必要があります。

于 2010-01-02T13:51:44.957 に答える
2

これについては何もできないと思います。これは SAX API によるものです。具体的には、http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#characters(char[],%20int,%20int)から

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

(私の強調)

于 2010-01-02T13:58:56.003 に答える