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

时间:2011-06-09 11:22:21

标签: java html xml parsing cdata

我的内容中包含格式错误的HTML文件。   由于xml无法解析像<br>这样的html标签,因此我使用CDATA进行保存和解析。

我使用过documentBuilder.setCoalescing(true);解析恢复数据<![CDATA[<br>test<br>data<br>]]>时没有CDATA标记..

但是在optput&lt;和&gt;标签分别由&lt; and &gt;替换..

我期待结果中的这个字符串...

<br>test<br>data<br>

在解析后的字符串中。

怎么做?任何的想法 ? 提前致谢 !

更新:我还有两个问题需要跟进..

1.有没有办法通过代码将格式错误的HTML(例如<br>)转换为可解析的xml(例如<br/>),如果是这样,它还会处理&nbsp;

2.是否有任何解决方案可以通过java将html文本转换为纯文本(例如<div>test&nbsp;text</div>test text)?

4 个答案:

答案 0 :(得分:2)

合并意味着解析器将CDATA节点转换为Text节点。当文档序列化为XML时,文本内容(HTML)当然必须被转义。如果你想对HTML做一些事情,你必须先将它作为文本提取 - 然后你可以在浏览器中渲染它,或者其他任何东西。

更新:

1)您可以使用JTidy http://jtidy.sourceforge.net/index.html来解析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(上面),你可以travserse它或应用XPATH或其他什么来提取想要的文本片段。请记住,这将被转移到'\ u00A0'。因此,如果想要真正的普通文本,您或许应该

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

答案 1 :(得分:2)

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

由此产生的行为是5个预定义实体的行为 - <, >, &, " and ',前三个将被展开,因为它们未经改动的存在将改变文档结构。

简而言之,通过从DOM中提取值,您无法做您打算做的事情。解析文档后,您需要将值解码为您想要的值。 Apache Commons Lang有一个实用程序类 - StringEscapeUtils that possesses the desired method

答案 2 :(得分:1)

如果您对格式不正确的XML感到困扰,可以考虑使用tidy工具将HTML转换为格式良好的XML。

通常,您需要一个XML解析器,它允许您访问CDATA标记部分的原始内容,然后将原始数据放入您想到的任何用途。

答案 3 :(得分:0)

@Billu:你可以看看apache open library: - org.apache.commons.lang.StringEscapeUtils。这个类得到了escapeXML()/ escapeHTML()和unescapeXML()/ escapeHTML()方法。 例如关于转换的第一个问题&lt;和&gt;你可以使用unescapeHTML(你的数据)。

您可能甚至不需要在CDATA部分存储/传递数据,您只需在发送/存储端使用escapeXML(数据);和接收/撤销结束时的用户unescapeXML(数据)。

有关更多信息,请点击此链接: - StringEscapeUtils

如果aboe信息帮助了你,请告诉我。