【问题标题】:XMLStreamWriter outputs invalid characters (does not encode formfeed)XMLStreamWriter 输出无效字符(不编码换页)
【发布时间】: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 解析器将拒绝 &lt;x&gt;&amp;#12;&lt;/x&gt;形成良好。 XML 1.1 在转义时确实允许该字符,但不允许作为文字。
  • 做到了!我改为 writer.writeStartDocument("1.1");并且换页符被正确转义,并且 XML 阅读器也能够恢复换页符。
  • 顺便说一句,我不得不使用woodstox而不是java内置的XML库来获得对XML 1.1的支持。

标签: java xml


【解决方案1】:

不是错误。这是一个特点。 您可以添加字符验证或自己实现 XMLStreamWriter 接口。

Oracle 文档http://docs.oracle.com/javase/7/docs/api/javax/xml/stream/XMLStreamWriter.html 说:

XMLStreamWriter 不会对其执行格式良好的检查 输入。但是 writeCharacters 方法需要转义 & , 对于属性值,writeAttribute 方法将转义 以上字符加“确保所有字符内容和 属性值形成良好。

对应http://www.w3.org/TR/xml11/#charsets xml 的受限字符为 [#x1-#x8]、[#xB-#xC]、[#xE-#x1F]、[#x7F-#x84]、[#x86-#x9F]

"\f" 是字符,代码为#x0C。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2016-01-21
    相关资源
    最近更新 更多