Java 使JAXB转义撇号

Java 使JAXB转义撇号,java,xml,jaxb,escaping,Java,Xml,Jaxb,Escaping,我正在使用JAXB将Java对象转换为XML。我需要将撇号(”)字符转义为&apos。默认情况下,JAXB不会转义撇号字符。我通过实现CharacterEscapeHandler了解了如何实现自定义转义处理程序。但是,我意识到Java 1.7中没有包含这个类。在哪里可以获得包含此类的最新库?下载的JAXB库中的类是否与Java 1.7中的JAXB类冲突?为了不依赖于JRE的其他版本/实现中不可用的内部类,您应该编写自己的(SAX)或(StAX)。这样您就可以完全控制输出 这里有一个例子。它展示了

我正在使用JAXB将Java对象转换为XML。我需要将撇号(
)字符转义为
&apos。默认情况下,JAXB不会转义撇号字符。我通过实现
CharacterEscapeHandler
了解了如何实现自定义转义处理程序。但是,我意识到Java 1.7中没有包含这个类。在哪里可以获得包含此类的最新库?下载的JAXB库中的类是否与Java 1.7中的JAXB类冲突?

为了不依赖于JRE的其他版本/实现中不可用的内部类,您应该编写自己的(SAX)或(StAX)。这样您就可以完全控制输出

这里有一个例子。它展示了JAXB通常如何输出XML,以及如何使用
ContentHandler
自己进行输出。它很简单,例如,性能不是很好,也没有名称空间支持。您可能希望编写一个更好的
escape()
方法版本。您可能还希望将输出写入文件,而不是控制台

公共类主{
公共静态void main(字符串[]args)引发异常{
JAXBContext JAXBContext=JAXBContext.newInstance(MyData.class);
Marshaller=jaxbContext.createMarshaller();
marshaller.marshall(新的MyData(“Test<'\“&>,“Test<'\“&>”),System.out);
System.out.println();
marshaller.marshall(新的MyData(“Test<'\“&>,“Test<'\“&>”),新的MyContentHandler());
}
}
@XmlRootElement
类MyData{
@XmlAttribute私有字符串名称;
@XmlElement私有字符串描述;
公共MyData(){}
public MyData(String name,String desc){this.name=name;this.desc=desc;}
}
类MyContentHandler实现ContentHandler{
@凌驾
公共无效setDocumentLocator(定位器定位器){
//无事可做
}
@凌驾
public void startDocument()引发异常{
系统输出打印(“”);
}
@凌驾
public void endDocument()引发异常{
//无事可做
}
@凌驾
public void startPrefixMapping(字符串前缀,字符串uri)引发SAXException{
抛出新的UnsupportedOperationException();
}
@凌驾
公共void endPrefixMapping(字符串前缀)引发SAXException{
抛出新的UnsupportedOperationException();
}
@凌驾
public void startElement(字符串uri、字符串localName、字符串qName、属性atts)引发异常{
系统输出打印('Test')&;

为了不依赖于JRE的其他版本/实现中不可用的内部类,您应该编写自己的(SAX)或(StAX),这样您就可以完全控制输出

下面是一个示例。它展示了JAXB通常如何输出XML,以及如何使用
ContentHandler
自己进行输出。它很简单,例如性能不是很好,也没有命名空间支持。您可能希望编写一个更好版本的
escape()
方法。您还可能希望将输出写入一个文件,而不是控制台

公共类主{
公共静态void main(字符串[]args)引发异常{
JAXBContext JAXBContext=JAXBContext.newInstance(MyData.class);
Marshaller=jaxbContext.createMarshaller();
marshaller.marshall(新的MyData(“Test<'\“&>,“Test<'\“&>”),System.out);
System.out.println();
marshaller.marshall(新的MyData(“Test<'\“&>,“Test<'\“&>”),新的MyContentHandler());
}
}
@XmlRootElement
类MyData{
@XmlAttribute私有字符串名称;
@XmlElement私有字符串描述;
公共MyData(){}
public MyData(String name,String desc){this.name=name;this.desc=desc;}
}
类MyContentHandler实现ContentHandler{
@凌驾
公共无效setDocumentLocator(定位器定位器){
//无事可做
}
@凌驾
public void startDocument()引发异常{
系统输出打印(“”);
}
@凌驾
public void endDocument()引发异常{
//无事可做
}
@凌驾
public void startPrefixMapping(字符串前缀,字符串uri)引发SAXException{
抛出新的UnsupportedOperationException();
}
@凌驾
公共void endPrefixMapping(字符串前缀)引发SAXException{
抛出新的UnsupportedOperationException();
}
@凌驾
public void startElement(字符串uri、字符串localName、字符串qName、属性atts)引发异常{
系统输出打印('Test')&;

虽然我喜欢Andreas给出的答案,但我不喜欢从头开始编写自己的
XmlStreamWriter
。我建议使用并提供自己的
EscapingWriterFactory
实现。例如:

XMLOutputFactory2 xmlOutputFactory = (XMLOutputFactory2)XMLOutputFactory.newFactory();
xmlOutputFactory.setProperty(XMLOutputFactory2.P_TEXT_ESCAPER, new EscapingWriterFactory() {

    @Override
    public Writer createEscapingWriterFor(Writer w, String enc) {
        return new EscapingWriter(w);
    }

    @Override
    public Writer createEscapingWriterFor(OutputStream out, String enc) throws UnsupportedEncodingException {
        return new EscapingWriter(new OutputStreamWriter(out, enc));
    }

});

marshaller.marshal(model, xmlOutputFactory.createXMLStreamWriter(out);

有关如何编写
EscapingWriter
的示例,请参见。

虽然我喜欢Andreas的答案,但我不喜欢从头开始编写自己的
XmlStreamWriter
。我建议使用并提供自己的
EscapingWriterFactory
实现。例如:

XMLOutputFactory2 xmlOutputFactory = (XMLOutputFactory2)XMLOutputFactory.newFactory();
xmlOutputFactory.setProperty(XMLOutputFactory2.P_TEXT_ESCAPER, new EscapingWriterFactory() {

    @Override
    public Writer createEscapingWriterFor(Writer w, String enc) {
        return new EscapingWriter(w);
    }

    @Override
    public Writer createEscapingWriterFor(OutputStream out, String enc) throws UnsupportedEncodingException {
        return new EscapingWriter(new OutputStreamWriter(out, enc));
    }

});

marshaller.marshal(model, xmlOutputFactory.createXMLStreamWriter(out);

可以在中看到如何编写
转义编写器的示例。

只是好奇:为什么?生成的XML无效吗?通常不需要转义撇号。但是我们有一个要求,它必须转义。因此我需要找出如何做。只是好奇:为什么?生成的XML无效吗?通常不需要转义模仿撇号。但我们有一个要求,它必须被转义。所以我需要找出如何做到这一点。