【发布时间】:2013-12-02 18:43:38
【问题描述】:
我使用 XMLOutputFactory 和默认的 Java 实现,当输出的文本有换页符时,它会生成一个无效的 XML 文件。显然,换页符必须转义,但 XML 编写器不会转义它。 (也许还有其他应该被转义的字符,也没有被转义)。
这是一个错误吗?是否有解决方法,或者我可以提供给 XML 编写器以更改行为的参数?
我正在写的文本可能有换页符,我想将其输出到 XML 中,以便以后阅读。
这是我的示例代码,\f 是换页符,两者都完全按照 ASCII 12(换页符)编写,没有被转义。当我将输出提供给 XML 解析器时,尝试读取换页时出现错误,“找到了无效的 XML 字符 (Unicode: 0xc)”。
public static void main(String[] args) throws XMLStreamException, FileNotFoundException, Exception {
XMLOutputFactory factory = XMLOutputFactory.newInstance();
try {
XMLStreamWriter writer = factory.createXMLStreamWriter(
new java.io.FileWriter("d:/xyz/ImportXml/out1.xml"));
writer.writeStartDocument();
writer.writeCharacters("\n");
writer.writeStartElement("document");
writer.writeCharacters("\n");
writer.writeCharacters("some text character value \"of the\" field & more text \f in <brackets> here.");
writer.writeCharacters("\n");
writer.writeStartElement("data");
writer.writeAttribute("name", "value \"of the\" field & more text \f in <brackets> here.");
writer.writeEndElement();
writer.writeCharacters("\n");
writer.writeEndElement();
writer.writeCharacters("\n");
writer.writeEndDocument();
writer.flush();
writer.close();
} catch (XMLStreamException e) {
e.printStackTrace();
} catch (java.io.IOException e) {
e.printStackTrace();
}
}
【问题讨论】:
-
请注意,在 XML 1.0 中根本不允许此特定字符,即使作为字符引用转义时也不允许 - XML 1.0 解析器将拒绝
<x>&#12;</x>形成良好。 XML 1.1 在转义时确实允许该字符,但不允许作为文字。 -
做到了!我改为 writer.writeStartDocument("1.1");并且换页符被正确转义,并且 XML 阅读器也能够恢复换页符。
-
顺便说一句,我不得不使用woodstox而不是java内置的XML库来获得对XML 1.1的支持。