Jaxb反序列化包含&<>符号的XML

6
使用JAXB解析我的XML时,我已经生成了所需的POJO,并成功地解析了XML。但是每当我的xml包含'&' '<>'字符时就会失败。根据规则,这需要更改为'&amp',但是生成XML的第三方不遵循规则。现在我该如何解析带有'& <>'符号的xml。
注意:对于编组,我找到了许多答案,但对于解组没有用。
环境-Java 8
XML示例:
<Customer Info> This is & Customer Info <Customer Info>

任何帮助都将是有益的。


你确定它与根元素名称中使用空格无关吗?试试使用 Customer_Info 代替 Customer Info - Michał Ziober
这是一个虚拟的 XML,我的问题出在文本“This is & Customer Info”中,其中我使用了 & 符号。 - Souvik
我创建了一个简单的应用程序,可以序列化和反序列化包含这些字符的XML,没有任何问题。你能否创建一个简单的应用程序来重现错误? - Michał Ziober
一个示例程序是 public static void main(String args[]) throws Exception { JAXBContext jaxbContext = JAXBContext.newInstance(Document.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); Document document = (Document) jaxbUnmarshaller .unmarshal(new File("CUSTINFO.xml")); }<CustInfo CustomerId="7 & 7"></CustInfo> 这只是一个演示。如果您可以粘贴您的程序,那将非常有帮助。另外,您能否检查一下您的 XSD 是否有任何特殊配置。 - Souvik
是的。我从第三方应用程序接收到XML。现在我只需要在我的系统中解析它。 - Souvik
显示剩余4条评论
3个回答

1

JSoup旨在处理比较粗糙和简单的HTML,因此使用比普通的XML API(例如随JRE附带的内置版本Xerces)更宽松的解析规则。

它可以输出适用于JAXB的W3C DOM XML:

    org.jsoup.nodes.Document soupDoc = Jsoup.parse(unescapedXml, "",
            Parser.xmlParser());
    org.w3c.dom.Document w3cDoc = new W3CDom().fromJsoup(soupDoc);

    JAXBContext jaxbContext = JAXBContext.newInstance(CustInfo.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    CustInfo custInfo = (CustInfo) jaxbUnmarshaller.unmarshal(w3cDoc);

(令人烦恼的是,JSoup和W3C都使用Document。)

这似乎很好地处理了XML属性或正文中的任何'&' '<''>',虽然肯定会有一些组合缺少转义字符。


0

有许多开源框架可以帮助编程,其中Jackson是比较流行的一个。作为开发者,除非我正在创建新的第三方序列化和反序列化程序,否则我会将解析任务留给实用程序。

请查看Jackson中的XMLMapper类进行序列化和反序列化。使用writeValue()和readValue()方法分别写入和读取XML。


0
你需要通过StringEscapeUtils.escapeXml()来传递XML字符串;
从文档中得知,

只支持五个基本的XML实体(gt、lt、quot、amp、apos)。 不支持DTD或外部实体。

请注意,大于0x7f的Unicode字符当前被转义为其数字\ u等价物。这可能会在未来的版本中发生变化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接