【发布时间】:2016-11-20 15:27:29
【问题描述】:
我正在编写一个实用程序来更改 XML 文件中的文本实体,使用 STAX 事件模型。我发现源文档中的一些空白没有被复制到输出中。我写了这个示例程序:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import javax.xml.stream.*;
import javax.xml.stream.events.*;
public class EventCopy {
private static final String INPUT =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<foo><bar>baz</bar></foo>\n";
public static void main(String[] args) throws XMLStreamException, IOException {
InputStream reader = new ByteArrayInputStream(INPUT.getBytes(StandardCharsets.UTF_8));
OutputStream writer = new ByteArrayOutputStream();
XMLInputFactory input = XMLInputFactory.newInstance();
XMLEventReader xmlReader = input.createXMLEventReader(reader, "UTF-8");
try {
XMLOutputFactory output = XMLOutputFactory.newInstance();
XMLEventWriter xmlWriter = output.createXMLEventWriter(writer, "UTF-8");
try {
while (xmlReader.hasNext()) {
XMLEvent event = xmlReader.nextEvent();
System.out.print(event.getEventType() + ",");
xmlWriter.add(event);
}
} finally {
xmlWriter.close();
}
} finally {
xmlReader.close();
}
System.out.println("\n[" + writer.toString() + "]");
}
}
使用 Oracle Java 7 附带的默认 Stax 实现,输出:
7,1,1,4,2,2,8,
[<?xml version="1.0" encoding="UTF-8"?><foo><bar>baz</bar></foo>]
XML 序言后面和输入末尾的换行符已消失。似乎读者甚至没有为他们生成事件。
我认为可能是 XML 阅读器将输入流留在了最后一个 XML 标记的末尾,并尝试添加代码以将尾随字符从输入复制到输出:
...
} finally {
xmlReader.close();
}
int ii;
while (-1 != (ii = reader.read())) {
writer.write(ii);
}
但这没有任何作用。
有没有办法让 STAX 更忠实地复制这个 XML?不同的 STAX 实现在这里会有不同的表现吗?
【问题讨论】:
-
尝试使用“
”而不是“\n”