XMLStreamWriter输出无效字符(不对formfeed进行编码)

时间:2013-12-02 18:43:39

标签: java xml

我正在使用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();
    }
}

1 个答案:

答案 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。