在xml文件中使用CDATA来解析html数据
我有一个xml文件,其内容格式错误HTML。 由于xml无法解析html标记,如<br>
我已经使用CDATA进行保存和解析。在xml文件中使用CDATA来解析html数据
我已经使用documentBuilder.setCoalescing(true);在解析恢复数据<![CDATA[<br>test<br>data<br>]]>
没有CDATA标签..
但在optput <和>标签是由< and >
分别替换..
余米期待此字符串结果...
<br>test<br>data<br>
分析字符串中的
。
如何做到这一点?任何想法 ? 在此先感谢!
更新:我在跟进两个问题..
1.Is有什么办法可以使通过代码格式不正确的HTML(如<br>
)来解析的XML,如果是的话会(如<br/>
。)它也处理
?
2.是否有任何解决方案通过java将html文本转换为纯文本格式(例如,<div>test text</div>
到test text
)?
聚结在这里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信息帮助您。
你在使用什么语法分析器? – spot35 2011-06-09 11:41:48
我正在使用javax.xml.parsers DOM(文档对象模型) – billu 2011-06-09 12:18:58