我的内容中包含格式错误的HTML文件。
由于xml无法解析像<br>
这样的html标签,因此我使用CDATA进行保存和解析。
我使用过documentBuilder.setCoalescing(true);解析恢复数据<![CDATA[<br>test<br>data<br>]]>
时没有CDATA标记..
但是在optput&lt;和&gt;标签分别由< and >
替换..
我期待结果中的这个字符串...
<br>test<br>data<br>
在解析后的字符串中。
怎么做?任何的想法 ? 提前致谢 !
更新:我还有两个问题需要跟进..
1.有没有办法通过代码将格式错误的HTML(例如<br>
)转换为可解析的xml(例如<br/>
),如果是这样,它还会处理
?
2.是否有任何解决方案可以通过java将html文本转换为纯文本(例如<div>test text</div>
到test text
)?
答案 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信息帮助了你,请告诉我。