2012-02-17 27 views
2

我需要轉換一個org.w3c.dom.Documentorg.jdom.Document如何org.w3c.dom.Document中轉換爲org.jdom.Document中

我曾嘗試按照下..

InputStream inputStream = new ByteArrayInputStream(str.getBytes()); 

Tidy tidy = new Tidy(); 
tidy.setMakeClean(false); 
tidy.setShowWarnings(true); //tidy.setShowWarnings(false); 
tidy.setTidyMark(false); 
tidy.setNumEntities(true); 
tidy.setQuoteAmpersand(true); 
tidy.setQuoteMarks(true); 
tidy.setQuoteNbsp(false); 
tidy.setHideEndTags(false); 
tidy.setDropEmptyParas(false); 

Document tidyDOM =tidy.parseDOM(inputStream, null); 
DOMBuilder domBuilder = new DOMBuilder(); 
org.jdom.Document jdomDoc = domBuilder.build(tidyDOM); 

domBuilder.build(tidyDOM)拋出以下例外:

org.jdom.IllegalNameException: The name "html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"" is not legal for JDOM/XML DocTypes: XML names cannot contain the character " ". 
    at org.jdom.DocType.setElementName(DocType.java:171) 
    at org.jdom.DocType.<init>(DocType.java:111) 
    at org.jdom.DocType.<init>(DocType.java:144) 
    at org.jdom.DefaultJDOMFactory.docType(DefaultJDOMFactory.java:118) 
    at org.jdom.input.DOMBuilder.buildTree(DOMBuilder.java:332) 
    at org.jdom.input.DOMBuilder.buildTree(DOMBuilder.java:170) 
    at org.jdom.input.DOMBuilder.build(DOMBuilder.java:135) 
    at test.JaxenTest.testParsingVisitor(JaxenTest.java:58) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 

回答

0

它在我看來好像JTidy正在創建格式不正確的DocType節點。我建議使用不同的HTML解析器。

我推薦The Validator.nu HTML Parser但還有很多其他的。

0

添加這兩個設置,一切都應該工作。

tidy.setXHTML(true); 
tidy.setDocType("omit"); 

第一個設置告訴jTidy輸出一個XHTML文件。一個XHTML文件是有效的XML。

第二個選項卡告訴tidy不要在代碼中輸出DOCTYPE行。由於某些原因,JDom似乎無法識別合法的html/xhtml文檔類型。

+1

公平地說,這不是一個JDOM問題。我認爲你會發現DOM文檔'餵養'JDOM是不準確的......你不能有一個叫做「html PUBLIC」的元素 - // W3C // DTD HTML 4.01 Transitional // EN「」 – rolfl 2012-05-03 02:32:39

相關問題