Java 如何在JAXB中解组xml时处理特殊字符

Java 如何在JAXB中解组xml时处理特殊字符,java,xml,jaxb,Java,Xml,Jaxb,我的测试xml内容 <p id="033" num="03">geopotent change&#x2 high.</p> 我的Jaxb解组源代码是 JAXBContext jaxbContext = JAXBContext.newInstance(CnDocument.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); documen

我的测试xml内容

    <p id="033" num="03">geopotent change&#x2 high.</p>
我的Jaxb解组源代码是

    JAXBContext jaxbContext = JAXBContext.newInstance(CnDocument.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    document = (CnDocument) jaxbUnmarshaller.unmarshal(xmlFile);

我怎样才能摆脱那些角色&x2

由于XML内容的格式不正确,因此会出现JAXB解析错误。
它应该是&x2;使用分号,而不是&x2。

会出现JAXB解析错误,因为XML内容的格式不正确。
它应该是&x2;带分号的非&x2。

位势变化&x2高。

不是有效的XML。使用&;对符号和字符进行转义;或者通过添加分号来完成字符引用:&x2

位势变化和x2高。

不是有效的XML。使用&;对符号和字符进行转义;或者通过添加分号来完成字符引用:&x2

这是一种方法:

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;

import com.sun.xml.bind.marshaller.CharacterEscapeHandler;

public class XmlCharacterHandler implements CharacterEscapeHandler {

    public void escape(char[] buf, int start, int len, boolean isAttValue,
            Writer out) throws IOException {
        StringWriter buffer = new StringWriter();

        for (int i = start; i < start + len; i++) {
            buffer.write(buf[i]);
        }

        String st = buffer.toString();

        if (!st.contains("CDATA")) {
            st = buffer.toString().replace("&", "&amp;").replace("<", "&lt;")
                .replace(">", "&gt;").replace("'", "&apos;")
                .replace("\"", "&quot;");

        }
        out.write(st);
        System.out.println(st);
    }

}

这是您可以执行的一种方法:

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;

import com.sun.xml.bind.marshaller.CharacterEscapeHandler;

public class XmlCharacterHandler implements CharacterEscapeHandler {

    public void escape(char[] buf, int start, int len, boolean isAttValue,
            Writer out) throws IOException {
        StringWriter buffer = new StringWriter();

        for (int i = start; i < start + len; i++) {
            buffer.write(buf[i]);
        }

        String st = buffer.toString();

        if (!st.contains("CDATA")) {
            st = buffer.toString().replace("&", "&amp;").replace("<", "&lt;")
                .replace(">", "&gt;").replace("'", "&apos;")
                .replace("\"", "&quot;");

        }
        out.write(st);
        System.out.println(st);
    }

}

解组器不支持CharacterEscapeHandler。@min:您可以处理第一个代码快照中提到的逻辑。解组器不支持CharacterEscapeHandler。@min:您可以处理第一个代码快照中提到的逻辑。
marshaller.setProperty(CharacterEscapeHandler.class.getName(),
                new XmlCharacterHandler());