Java 如何将未扫描的XML写入XMLStreamWriter?

Java 如何将未扫描的XML写入XMLStreamWriter?,java,xml,stax,Java,Xml,Stax,我有许多小XML块,它们应该作为子元素嵌入到一个大XML中。有没有办法将这些块写入XMLStreamWriter而不转义它们?下面是处理这些块的两个选项: 选项1-使用javax.xml.transform.Transformer 您可以使用javax.xml.transform.Transformer将表示xml片段的StreamSource转换到您的StAXResult上,后者正在包装您的XMLStreamWriter 选项2-直接与输出流交互 或者,您可以执行以下操作。您可以利用flush

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

下面是处理这些块的两个选项:

选项1-使用
javax.xml.transform.Transformer
您可以使用
javax.xml.transform.Transformer
将表示xml片段的
StreamSource
转换到您的
StAXResult
上,后者正在包装您的
XMLStreamWriter

选项2-直接与
输出流交互
或者,您可以执行以下操作。您可以利用
flush()
强制
XMLStreamWriter
输出其内容。然后您会注意到,我使用
xsw.writeCharacters(“”)
这将强制开始元素在将嵌套XML作为
字符串写入之前结束
bar
。下面的示例代码需要刷新以正确处理编码问题

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();
    }

}
import java.io.*;
导入javax.xml.stream.*;
公开课演示{
公共静态void main(字符串[]args)引发异常{
OutputStream=System.out;
XMLOutputFactory xof=XMLOutputFactory.newFactory();
XMLStreamWriter xsw=xof.createXMLStreamWriter(流);
xsw.writeStartDocument();
xsw.WriteStarteElement(“foo”);
xsw.WriteStarteElement(“bar”);
/*下面这一行非常重要,没有它,数据就无法显示
将显示在标记内*/
xsw.writeCharacters(“”);
xsw.flush();
OutputStreamWriter osw=新的OutputStreamWriter(流);
写(“你好世界”);
osw.flush();
xsw.writeEndElement();
xsw.writeEndElement();
xsw.writeEndDocument();
xsw.close();
}
}

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

final XMLOutputFactory streamWriterFactory = XMLOutputFactory.newFactory();
streamWriterFactory.setProperty("escapeCharacters", false);

我想你做不到。以这种方式编写损坏的XML太容易了。您可以使用Xslt标识转换来转换XML,并基于XMLStreamWriter将结果输出到StaxResult…@JoachimSauer当然可以。但让我们假设我知道我想做什么:)。我没有试图暗示其他;-)我只是想解释一下为什么这个界面缺少(某种明显的)功能。我认为通过身份转换器(就像写入文件一样)来实现这一点是一种方式,谢谢你的想法。也许回答这个问题是有意义的?对于第二种方法,您必须小心地在
OutputStreamWriter
中使用与输出工厂配置完全相同的编码。即使默认使用UTF-8,也比仅仅使用平台默认编码(正如您目前所做的那样)更有可能起作用。转换在片段的开头插入一个
,并在结尾关闭原始标记(在您的示例中,
foo
bar
元素将在转换运行后关闭。尝试一下,看看我的意思。您是否可以提供选项1的示例?这是最简单的解决方案!谢谢。