我正在使用XMLOutputFactory和默认的Java实现,当输出的文本具有formfeed时,它会生成一个无效的XML文件。显然,必须转义换页符,但XML编写器不会逃避它。 (也许还有其他角色应该被转义,也没有被转义)。
这是一个错误吗?是否有解决方法,或者我可以提供给XML编写器的参数来改变行为吗?
我写的文字可能有表格,我想把它输出到XML中,以后能够阅读。
这是我的示例代码,\ f是formfeed,两者都完全按照ASCII 12(换页)编写而不进行转义。当我将输出提供给XML解析器时,我在尝试读取formfeed时遇到错误,“找到了无效的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();
}
}
答案 0 :(得分:1)
不是错误。这是一个功能。 您可以添加字符验证或自己实现XMLStreamWriter接口。
Oracle文档http://docs.oracle.com/javase/7/docs/api/javax/xml/stream/XMLStreamWriter.html说:
XMLStreamWriter不会对其执行格式良好的检查 输入。但是,writeCharacters方法需要转义&amp; ,&lt; 和&gt;对于属性值,writeAttribute方法将转义 以上字符加“以确保所有字符内容和 属性值形成良好。
对应http://www.w3.org/TR/xml11/#charsets xml的受限制字符为[#x1-#x8],[#xB-#xC],[#xE-#x1F],[#x7F-#x84],[#x86-#x9F]
“\ f”是char,代码为#x0C。