1

このXMLドキュメントをSAXパーサーで解析しようとしています。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE WIN_TPBOUND_MESSAGES SYSTEM "tpbound_messages_v1.dtd">
<WIN_TPBOUND_MESSAGES>
    <SMSTOTP>
        <SOURCE_ADDR>+447522579247</SOURCE_ADDR>
        <TEXT>TEST: @£$¥èéùìò?ØøÅå&amp; ^{}\\[~]¡&#8364;ÆæßÉ!\"#¤%'()*+,-./0123456789:;&lt;=&gt;? ÄÖÑܧ¿äöñüà end</TEXT>
        <WINTRANSACTIONID>652193268</WINTRANSACTIONID>
    </SMSTOTP>
</WIN_TPBOUND_MESSAGES>

要素を解析した後<TEXT>、コンテンツは次のように変換されます。

TEST: @£$¥èéùìò?Ã�øÃ�Ã¥& ^{}\\[~]¡€Ã�æÃ�Ã�!\"#¤%'()*+,-./0123456789:;<=>? Ã�Ã�Ã�Ã�§¿äöñüà end

したがって、明らかに非ASCII文字に何か悪いことが起こっています。XMLを解析するコードを以下に示します。

public void parse(InputStream xmlStream) throws WinGatewayException {
    XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
    parser.setContentHandler(this);
    parser.setErrorHandler(error);
    parser.setEntityResolver(new DTDResolver());
    parser.setDTDHandler(this);
    parser.setFeature("http://xml.org/sax/features/validation", true);
    parser.setFeature("http://apache.org/xml/features/validation/schema", true);
    parser.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", true);
    parser.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
    parser.setFeature("http://apache.org/xml/features/continue-after-fatal-error", false);
    parser.parse(new InputSource(xmlStream));
}

によって参照されるオブジェクトには、次のthisようなメソッドがあります。

public void endElement(String uri, String localName, String qName)
        throws SAXException {

        if (localName.equals("TEXT")) {   
            logger.debug("Parsed message text: " + cData.toString());
            message.setText(cData.toString());
        }
}

これらの非ASCII文字がXMLパーサーによって保持されないのはなぜですか?

4

1 に答える 1

3

あなたのXMLファイルは実際にはISO-8859-1ではなくUTF-8にあると思います。

ISO-8859-1でエンコードされたファイルは、文字ごとに1バイトになるため、英国ポンド記号は1バイトの0xA3になります。ただし、ファイルには0xC2 0xA3があるようです。これは、UTF-8のU+00A3で取得するバイトシーケンスです。

これを反映するようにXML宣言を変更します。

<?xml version="1.0" encoding="UTF-8"?>

それで問題が解決するかどうかを確認します。そうだと仮定すると、最初にこの悪いデータを生成したものを解明する必要があります。

于 2012-06-21T11:00:48.570 に答える