防止eclipselink moxy逃避元素内容

时间:2013-10-22 21:43:51

标签: java xml xml-parsing eclipselink moxy

我有以下课程:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "item", propOrder = {
    "content"
})
public class Item {

    @XmlElementRefs({
        @XmlElementRef(name = "ruleref", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "tag", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "one-of", type = JAXBElement.class, required = false),
        @XmlElementRef(name = "item", type = JAXBElement.class, required = false)
    })    
    @XmlMixed
    protected List<Serializable> content;

元素可以包含带引号的字符串,例如:

<tag>"some kind of text"</tag>

此外,item元素本身可以包含带引号的字符串:

<item>Some text, "this has string"</item>

使用Moxy时生成的XML会转义标记和项元素中的文本值:

<tag>&quote;some kind of text&quote;</tag>

我如何阻止它这样做,但仅限于这些元素?属性和其他元素应保持不变(我意味着转义)。

谢谢。

1 个答案:

答案 0 :(得分:2)

您可以通过提供自己的CharacterEscapeHandler来覆盖默认字符转义。

Java模型

<强>富

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Foo {

    private String bar;

    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

}

演示代码

<强>演示

import java.io.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.MarshallerProperties;
import org.eclipse.persistence.oxm.CharacterEscapeHandler;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Foo foo = new Foo();
        foo.setBar("\"Hello World\"");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);

        marshaller.setProperty(MarshallerProperties.CHARACTER_ESCAPE_HANDLER, new CharacterEscapeHandler() {

            @Override
            public void escape(char[] buffer, int start, int length,
                    boolean isAttributeValue, Writer out) throws IOException {
                out.write(buffer, start, length);
            }

        });

        marshaller.marshal(foo, System.out);
    }

}

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<foo>
   <bar>&quot;Hello World&quot;</bar>
</foo>
<?xml version="1.0" encoding="UTF-8"?>
<foo>
   <bar>"Hello World"</bar>
</foo>