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

问题描述:

我有一个xml文件,其内容格式错误HTML。 由于xml无法解析html标记,如<br>我已经使用CDATA进行保存和解析。在xml文件中使用CDATA来解析html数据

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

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

余米期待此字符串结果...

<br>test<br>data<br> 
分析字符串中的

如何做到这一点?任何想法 ? 在此先感谢!

更新:我在跟进两个问题..

1.Is有什么办法可以使通过代码格式不正确的HTML(如<br>)来解析的XML,如果是的话会(如<br/>。)它也处理&nbsp;

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

+0

你在使用什么语法分析器? – spot35 2011-06-09 11:41:48

+0

我正在使用javax.xml.parsers DOM(文档对象模型) – billu 2011-06-09 12:18:58

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

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

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

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

UPDATE:

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(上面)时,你可以传递它或者应用XPATH或其他任何方法来提取想要的文本片段。请记住 将被转义为'\ u00A0'。所以,如果想真正纯文本,你或许应该做

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

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

一般来说,您需要一个XML解析器,它允许您访问CDATA标记节的原始内容,然后将该原始数据放到您想要的任何用途中。

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

你可能甚至不需要在CDATA部分存储/传递数据,你可以在发送/存储端使用escapeXML(data)和用户unescapeXML(数据)在接收/ retreival结束。

更多的信息,这里是链接: - StringEscapeUtils

请让我知道如果aboe信息帮助您。