5

拡張ユニコード文字を含む 2 つの属性値を持つ XML ファイルを作成してみましょう

XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();

try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(ERROR_XML), "UTF-8"))) {
XMLStreamWriter xmlStreamWriter = outputFactory.createXMLStreamWriter(writer);

xmlStreamWriter.writeStartDocument();
xmlStreamWriter.writeCharacters("\n");
xmlStreamWriter.writeStartElement("start");
xmlStreamWriter.writeAttribute("test1", "11");
xmlStreamWriter.writeAttribute("test2", "22");
xmlStreamWriter.writeEndElement();
xmlStreamWriter.writeEndDocument();
}

生成されたファイルは次のようになります。

<?xml version="1.0" ?>
<start test1="11" test2="22"></start>

これを再度読み込んで属性値を調べると

XMLInputFactory inputFactory = XMLInputFactory.newInstance();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(ERROR_XML), "UTF-8"))) {
XMLStreamReader xmlStreamReader = inputFactory.createXMLStreamReader(reader);

xmlStreamReader.nextTag();
if (XMLStreamReader.START_ELEMENT == xmlStreamReader.getEventType() &&
    "start".equals(xmlStreamReader.getLocalName())) 
{
    System.out.println(xmlStreamReader.getAttributeValue(0));
    System.out.println(xmlStreamReader.getAttributeValue(1));
}}

これは印刷されます

11
22

驚くべきことに、2 番目の属性値には拡張 Unicode 文字が 2 回含まれています。

その後、属性値として拡張文字を使用すると、このカウントが増加します。あるケースでは、1 つではなく 12000 文字の同一の属性値を受け取りました。ここで何が起きてるの?

4

1 に答える 1

0

Java API対応クラスにバグがあります。

「woodstox.jar」を使用して正しく行うことができます。XML ファイルを読み取るコードを次のように変更するだけです。

  • XMLStreamReaderの代わりにXMLStreamReader2
  • XMLInputFactoryの代わりにXMLInputFactory2

正しく動作します。私は自分自身をテストしました。

「woodstox.jar」はhttp://wiki.fasterxml.com/WoodstoxDownloadにあります。

于 2015-05-21T09:06:05.067 に答える