【问题标题】:How to handle special characters while unmarshalling xml in JAXB如何在 JAXB 中解组 xml 时处理特殊字符
【发布时间】:2017-03-28 09:51:39
【问题描述】:

我的测试 xml 内容

    <p id="033" num="03">geopotent change&#x2 high.</p>

我运行 Jaxb Unmarshalling,但出现异常

    09:58:43.748 ERROR [main][net.ServiceImpl] Parsing Error: 
    javax.xml.bind.UnmarshalException- with linked exception:    
    [javax.xml.stream.XMLStreamException: ParseError at [row,col]:
    [161,306]Message: String "&#]

我的 Jaxb 解组源是

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

如何转义这些字符? ()

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    您收到 JAXB 解析错误,因为您的 XML 内容格式不正确。 应该是&amp;#x2;(带分号),而不是&amp;#x2

    【讨论】:

      【解决方案2】:

      &lt;p id="033" num="03"&gt;geopotent change&amp;#x2 high.&lt;/p&gt; 不是有效的 XML。使用&amp;amp;“转义”& 字符或通过添加分号使字符引用完整:&amp;#x2;

      【讨论】:

        【解决方案3】:

        这是你可以做的一种方式:

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

        编组时:

        marshaller.setProperty(CharacterEscapeHandler.class.getName(),
                        new XmlCharacterHandler());
        

        【讨论】:

        • unmarshaller 不支持 CharacterEscapeHandler。
        • @min:你可以按照我第一个代码快照中提到的逻辑来处理它。
        猜你喜欢
        • 2013-09-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 2011-05-19
        • 1970-01-01
        • 2013-06-04
        • 2011-07-14
        相关资源
        最近更新 更多