mar*_*sen 5 java unicode attributes xmlstreamreader
让我们创建一个包含两个属性值的XML文件,其中包含一个扩展的unicode char
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();
}
Run Code Online (Sandbox Code Playgroud)
生成的文件如下所示:
<?xml version="1.0" ?>
<start test1="11" test2="22"></start>
Run Code Online (Sandbox Code Playgroud)
如果再次读入并检查属性值
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));
}}
Run Code Online (Sandbox Code Playgroud)
这将打印
11
22
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,第二个属性值包含2次扩展的unicode char!
以下任何使用扩展char作为属性值都会增加此计数.在一个案例中,我收到了12000个相同字符的属性值,而不是一个.这里发生了什么?
小智 0
Java API对应的类存在bug。
您可以使用“woodstox.jar”来正确执行此操作。您需要做的就是修改读取 XML 文件的代码,如下所示:
它将正常工作。我已经测试过我自己了。
您可以在http://wiki.fasterxml.com/WoodstoxDownload中找到“woodstox.jar” 。
| 归档时间: |
|
| 查看次数: |
653 次 |
| 最近记录: |