簡體   English   中英

在xml文件中使用CDATA來解析html數據

[英]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中,<和>標簽被替換為&lt; and &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 )?

合並意味着解析器將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM