![](/img/trans.png)
[英]Parsing XML, no string returned if CDATA does not contain an HTML tag
[英]using CDATA in an xml file for to parsing html data
我的內容中有一個格式錯誤的HTML文件。由於xml無法解析像我這樣的html標簽<br>
我使用CDATA進行保存和解析。
我用過documentBuilder.setCoalescing(true); 解析恢復數據<![CDATA[<br>test<br>data<br>]]>
沒有CDATA標簽..
但在optput中,<和>標簽被替換為< and >
< and >
分別 ..
我期待結果中的這個字符串...
<br>test<br>data<br>
在解析的字符串中。
這該怎么做 ? 任何的想法 ? 提前致謝 !
更新:我還有兩個問題需要跟進..
1.有沒有辦法通過代碼將格式錯誤的HTML(例如。 <br>
)轉換為可解析的xml(例如。 <br/>
),如果有的話,它會處理
還呢?
2.有什么解決方案可以通過java將html文本轉換為純文本(例如<div>test text</div>
來test text
)?
合並意味着解析器將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', ' ');
合並是一種操作,其中CDATA部分(節點)的內容被轉換為文本節點並與相鄰文本節點的內容合並。 將CDATA部分轉換為文本節點本身的這一要求將強加限制,即生成的文本節點由有效的XML字符組成。 這將保留原始文檔格式; 換句話說,原始文檔中節點的結構不會發生變化。
由此產生的行為是5個預定義實體的行為 - <, >, &, " and '
,前三個將被擴展,因為它們未改變的存在將改變文檔結構。
簡而言之,通過從DOM中提取值,您無法做您打算做的事情。 解析文檔后,您需要將值解碼為您想要的值。 Apache Commons Lang有一個實用程序類 - StringEscapeUtils,它擁有所需的方法 。
如果您只是對格式不正確的XML感到困擾,您可能會考慮使用可以將HTML轉換為格式良好的XML的整潔工具。
通常,您需要一個XML解析器,它允許您訪問CDATA標記部分的原始內容,然后將原始數據放入您考慮的任何用途。
@Billu:你可以看看apache open library: - org.apache.commons.lang.StringEscapeUtils。 這個類得到了escapeXML()/ escapeHTML()和unescapeXML()/ escapeHTML()方法。 例如關於轉換<和>的第一個問題,你可以使用unescapeHTML(你的數據)。
您可能甚至不需要在CDATA部分存儲/傳遞數據,您可以在發送/存儲端使用escapeXML(數據); 和接收/撤銷結束時的用戶unescapeXML(數據)。
有關更多信息,請訪問以下鏈接: - StringEscapeUtils
如果aboe信息對您有幫助,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.