Java 在xml文件中使用CDATA解析html数据

Java 在xml文件中使用CDATA解析html数据,java,html,xml,parsing,cdata,Java,Html,Xml,Parsing,Cdata,我有一个xml文件,其内容中包含格式不正确的HTML。。 由于xml无法解析像这样的html标记,所以我使用CDATA进行保存和解析 我使用过documentBuilder.setCoalescing(true);在解析以恢复数据时测试数据]>不带CDATA标记 但是在optput中,标记分别被和替换 我期待这个字符串的结果 <br>test<br>data<br> 测试数据 在解析的字符串中 如何做到这一点?有什么想法吗? 提前谢谢 更新:我还有两个问题

我有一个xml文件,其内容中包含格式不正确的HTML。。 由于xml无法解析像

这样的html标记,所以我使用CDATA进行保存和解析

我使用过documentBuilder.setCoalescing(true);在解析以恢复数据时
测试
数据
]>
不带CDATA标记

但是在optput中,<和>标记分别被
替换

我期待这个字符串的结果

<br>test<br>data<br>

测试
数据
在解析的字符串中

如何做到这一点?有什么想法吗? 提前谢谢

更新:我还有两个问题要问

1.有没有办法通过代码将格式错误的HTML(如

)转换成可解析的xml(如

),如果有,它还会处理


2.是否有通过java将html文本转换为纯文本的解决方案(例如,
测试文本
转换为
测试文本
)?

合并意味着解析器将CDATA节点转换为文本节点。当文档序列化为XML时,当然必须转义文本内容(HTML)。若你们想用HTML做些什么,你们必须先把它提取成文本——然后你们可以在浏览器中呈现它,或者其他任何东西

更新:

1) 您可以使用JTidy解析HTML内容并生成XML或XHTML。大概是这样的:

DocumentBuilder db = factory.newDocumentBuilder();
Document doc = db.parse(..)); // parse your input document

// Obtain the HTML content, may be buried deeper down or
// or scattered around in different places
String text = doc.getDocumentElement().getTextContent();

// Parse with JTidy to convert from HTML to XHTML
Tidy tidy = new Tidy();
tidy.setXHTML(true);

Document htmlDoc = tidy.parseDOM(new StringReader(text), null);
Transformer t = TransformerFactory.newInstance().newTransformer();
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.transform(new DOMSource(htmlDoc), new StreamResult(System.out));
2) 对。当您拥有解析后的htmlDoc(如上)时,您可以转换它或应用XPATH或其他方法来提取所需的文本片段。请记住,将不替换为“\u00A0”。所以如果你真的想要纯文本,你也许应该这样做

String s = text.replace('\u00A0', ' ');

合并是将CDATA节(节点)的内容转换为文本节点并与相邻文本节点的内容合并的操作。将CDATA节转换为文本节点的这一要求本身将限制生成的文本节点由有效的XML字符组成。这将保留原始文档格式;换句话说,原始文档中节点的结构不会发生更改

由此产生的行为是5个预定义实体——
、&“和”
,前三个将被扩展,因为它们的不变存在将改变文档结构


简而言之,你不能做你想做的事情,从DOM中提取值。在解析文档之后,你需要将这些值解码成你想要的。Apache Con on有一个实用类-< /p>

如果你只是被不成形的XML困扰,你可以考虑把HTML转换成格式良好的XML的工具。


一般来说,您需要一个XML解析器,它允许您访问带有CDATA标记的部分的原始内容,然后将这些原始数据用于您想要的任何用途。

@Billu:您可以查看apache开放库:-org.apache.commons.lang.StringEscapeUtils。这个类有escapeXML()/escapeHTML()和unescapeXML()/escapeHTML()方法。 例如,关于转换<和>的第一个问题,您可以使用unescapeHTML(您的数据)

您甚至不需要在CDATA部分中存储/传递数据,只需在发送/存储端使用escapeXML(数据),在接收/检索端使用用户unescapeXML(数据)

有关更多信息,请访问以下链接:-


如果aboe信息对您有帮助,请告诉我。

我正在使用javax.xml.parsers DOM(文档对象模型)