【问题标题】:How to write unescaped XML to XMLStreamWriter?如何将未转义的 XML 写入 XMLStreamWriter?
【发布时间】:2013-11-28 16:35:54
【问题描述】:

我有许多小的 XML 块,它们应该作为子元素嵌入到一个大的 XML 中。有没有办法将这些块写入XMLStreamWriter 而不会转义它们?

【问题讨论】:

  • 我不认为你可以。以这种方式编写损坏的 XML 太容易了。
  • 您可以使用 Xslt 身份转换来转换您的 XML,然后根据您的 XMLStreamWriter 将结果输出到 StaxResult...
  • @JoachimSauer 当然会。但是让我们假设我知道我想要做什么:)。
  • 我并没有试图暗示 ;-) 我只是想解释这个界面缺少那个(有点明显的)功能的可能原因。我认为通过身份转换器(就像写入文件一样)去路径是去这里的方式
  • 感谢您的想法。或许用它来回答是有意义的?

标签: java xml stax


【解决方案1】:

以下是处理此问题的几个选项:

选项 #1 - 使用 javax.xml.transform.Transformer

您可以使用javax.xml.transform.Transformer 将代表您的XML 片段的StreamSource 转换为包装您的XMLStreamWriterStAXResult

选项 #2 - 直接与OutputStream 交互

或者,您可以执行以下操作。您可以利用flush() 强制XMLStreamWriter 输出其内容。然后你会注意到我做了xsw.writeCharacters("") 这会强制开始元素以bar 结束,然后再将嵌套的XML 编写为String。下面的示例代码需要刷新才能正确处理编码问题。

import java.io.*;
import javax.xml.stream.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        OutputStream stream = System.out;
        
        XMLOutputFactory xof = XMLOutputFactory.newFactory();
        XMLStreamWriter xsw = xof.createXMLStreamWriter(stream);
        
        xsw.writeStartDocument();
        xsw.writeStartElement("foo");
        xsw.writeStartElement("bar");
        
        /* Following line is very important, without it unescaped data 
           will appear inside the <bar> tag. */
        xsw.writeCharacters("");
        xsw.flush();
        
        OutputStreamWriter osw = new OutputStreamWriter(stream);
        osw.write("<baz>Hello World<baz>");
        osw.flush();
        
        xsw.writeEndElement();
        xsw.writeEndElement();
        xsw.writeEndDocument();
        xsw.close();
    }

}

【讨论】:

  • 使用第二种方法,您必须小心在OutputStreamWriter 中使用与输出工厂配置完全相同的编码。即使默认为 UTF-8 也比仅使用平台默认编码(如您当前所做的那样)更有可能工作。
  • 我没有让选项 #1 起作用。转换在片段的开头插入 &lt;?xml version="1.0"?&gt; 并在末尾关闭原始标签(在您的示例中,foobar 元素将在转换器运行后关闭。试试看我意思。
  • 你能提供一个选项1的例子吗?
【解决方案2】:

woodstox 有一个 stax 实现,他们的 XMLStreamWriter2 类有一个 writeRaw() 调用。我们有同样的需求,这给了我们一个很好的解决方案。

【讨论】:

    【解决方案3】:
    final XMLOutputFactory streamWriterFactory = XMLOutputFactory.newFactory();
    streamWriterFactory.setProperty("escapeCharacters", false);
    

    From here

    【讨论】:

    • 这是最简单的解决方案!谢谢。
    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多