1

次のタイプの XML を SAX で解析しています。

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ROOT>
    <MESSAGES>
        <MESSAGE>
            <SUBJECT><![CDATA[Some text]]></SUBJECT>
            <BODY><![CDATA[Some text Some Text ]]></BODY>
            <RECIPIENTS>
                <TO><![CDATA[mail1@domain.com]]></TO>
                <TO><![CDATA[mail2@domain2.com]]></TO>
            </RECIPIENTS>
        </MESSAGE>
        <MESSAGE>
            <SUBJECT><![CDATA[Some text]]></SUBJECT>
            <BODY><![CDATA[Some text1 Some Text2 ]]></BODY>
            <RECIPIENTS>
                <TO><![CDATA[mail1@domain.com]]></TO>
                <TO><![CDATA[mail2@domain2.com]]></TO>
            </RECIPIENTS>
        </MESSAGE>

           <!-- List of 50 MESSAGE ITEM-->
    </MESSAGES>

</ROOT>

メソッド文字が呼び出されると、

public void characters(char buf[], int offset, int len) throws SAXException
    {
     String currentValue = new String(buf, offset, len);
     System.out.println(currentValue);
    }

一部のメッセージ項目で、誤った値を受け取ります。たとえば、タグ BODY を解析しているときに、'Some text1 Some Text2'を受信する必要があるときに'1 Some Text2'を取得し、印刷しても失われたデータを見つけることができません。このメソッドで受信したすべてのデータをコンソールします。

メッセージ 47 では、常に同じ位置でデータをカットします (他のメッセージでも、常に同じ位置で)。この問題は、キャラクターが一度に 2 回以上呼び出していることが原因である可能性があると思いますが、前に言っておきますが、コンソールにすべてを出力しても、失われたデータが表示されません。

助けてください。

ありがとう

4

1 に答える 1

6

characters は、一度にすべてのテキストを返すことを保証しないことに注意してください。BODY のテキストの後に、最後の /BODY を受け取るまで、すべてのテキストがあることを保証することはできません。つまり、文字を 1 回または何度も呼び出すことができます。stringBuilder のように、最後までまとめるテキストを追加する必要があります。

StringBulder xmlText = new StringBuilder();

 public void characters(char buf[], int offset, int len) throws SAXException
 {
    xmlText.append(buf, offset, len);

}

public void endElement(String uri, String localName, String qname) throws SAXException 
{
    System.out.println(xmlText.toString());
    xmlText = new StringBuilder();
}
于 2012-04-27T10:08:44.727 に答える