我正在使用下面的函數將DOM Document對象轉換爲Java中的String。使用Java序列化Document對象,同時保留任意元素的格式
public static String convertDocumentToString(final Document doc) {
final DOMImplementationLS domImplementation = (DOMImplementationLS) doc.getImplementation();
final LSSerializer lsSerializer = domImplementation.createLSSerializer();
lsSerializer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
final String xml = lsSerializer.writeToString(doc);
return xml;
}
這種運作良好,大部分的時間,但有是我不希望的格式(例如屏幕的DocBook元素)的某些具體內容。所以我有兩個問題:
- 有沒有辦法跳過某些元素,當在Java中像在上面的代碼中格式化XML?
- 如果沒有,是否有另一種方法來將文檔轉換爲字符串,同時保留任意元素的佈局?
請注意,我過去也使用過變壓器(請參閱Getting xml string from Document in Java),但這並不能保留CDATA部分。
更新:
只是讓我明白,我反序列化,並以創建一個可以編程方式通過DOM編輯的文檔對象序列化XML,與序列化過程最好「漂亮打印」的產生的XML(除了一些任意元素)。
更新2:
最後,我創建了一個自定義函數節點轉換爲帶有可選格式的字符串。看到https://sourceforge.net/p/commonclasses/code/110/tree/trunk/src/com/redhat/ecs/commonutils/XMLUtilities.java的convertNodeToString函數調用就像這樣:
final String exampleXml = FileUtilities.readFileContents(new File("test.xml"));
final ArrayList<String> contentsInlineElements = new ArrayList<String>();
contentsInlineElements.add("title");
contentsInlineElements.add("term");
final ArrayList<String> inlineElements = new ArrayList<String>();
inlineElements.add("prompt");
inlineElements.add("command");
inlineElements.add("firstterm");
inlineElements.add("ulink");
inlineElements.add("guilabel");
inlineElements.add("filename");
inlineElements.add("replaceable");
inlineElements.add("parameter");
inlineElements.add("literal");
inlineElements.add("classname");
inlineElements.add("sgmltag");
inlineElements.add("guibutton");
inlineElements.add("guimenuitem");
inlineElements.add("guimenu");
inlineElements.add("menuchoice");
inlineElements.add("citetitle");
final ArrayList<String> verbatimElements = new ArrayList<String>();
verbatimElements.add("screen");
verbatimElements.add("programlisting");
final Document doc = XMLUtilities.convertStringToDocument(exampleXml);
final String formattedXml = XMLUtilities.convertNodeToString(doc.getDocumentElement(), true, false, false, verbatimElements, inlineElements, contentsInlineElements, true, 1, 0);
我使用的工作流程是:1.反序列化一個XML字符串以創建一個Document對象2.處理Document對象(添加和移除元素)3.將Document對象序列化回String,最好使用漂亮的打印。在這種情況下,「序列化」只是一種創建內存表示的方式,我可以通過DOM可靠地編輯XML,而不是通過傳輸介質移動數據。 – Phyxx
嗯...我不知道任何XML庫(儘管我沒有看起來太難)可能會排除格式化的任意元素。我甚至不確定這是否可以實施並滿足所有需求。我想你可能要考慮XML中的Base64(或任何其他)編碼。至少是一個可靠的實現,而不必擔心未來可能會破壞XML依賴關係的更新。 –