让我们创建一个带有两个属性值的XML文件,其中包含一个扩展的Unicode字符

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", "1𩸽1");
xmlStreamWriter.writeAttribute("test2", "2𩸽2");
xmlStreamWriter.writeEndElement();
xmlStreamWriter.writeEndDocument();
}

生成的文件如下所示:
<?xml version="1.0" ?>
<start test1="1𩸽1" test2="2𩸽2"></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));
}}

这将打印
1𩸽1
2𩸽𩸽2

令人惊讶的是,第二个属性值包含扩展的unicode char 2次!

以后将扩展的char作为属性值使用时,都会增加此计数。
在一种情况下,我收到的属性值带有12000个相同的字符,而不是一个。
这是怎么回事

最佳答案

Java API对应的类中存在错误。

您可以使用“woodstox.jar”正确地进行操作。您需要做的就是修改读取XML文件的代码,如下所示:

  • XMLStreamReader2 而不是 XMLStreamReader
  • XMLInputFactory2 而不是 XMLInputFactory

  • 它将正常工作。我已经测试了自己。

    您可以在http://wiki.fasterxml.com/WoodstoxDownload中找到“woodstox.jar”。

    10-08 14:06