2011-10-17 46 views
4

我正在使用Dom4J編寫xml文件的程序。我正在寫的數據庫模式有一個方便的xml驗證和導入模式。 Dom4J工作得很好,但是,我似乎無法弄清楚如何在Dom4J的XMLWriter類中設置'preserve'字段。我有一個特定的元素,我需要編碼的'\ n的保留。Dom4J在寫入文件時保留空白

這個類的Javadoc是一個小未公開http://dom4j.sourceforge.net/dom4j-1.6.1/apidocs/org/dom4j/io/XMLWriter.html

我試着玩弄OUTPUTFORMAT對象,但沒有骰子上。

任何人都可以告訴我如何確保XMLWriter對象在寫入文件時保留dom4j樹元素的空白。

感謝,

唐納德

說我開始:

Element accession = factory.createElement("title"); 
List<String> AUT = new ArrayList<String>; 
AUT.add("author1"); 
AUT.add("author2"); 
String title = "Title"; 

我想有類似的輸出:

<title>author1 
author2 
Title</title> 

隨着線返回編碼進入標題字段。

DefaultEntity e = new DefaultEntity("#10"); 
if(AUT.size() > 1) { 
    for(String a : AUT) { 
    accession.addText(a); 
    accession.add(e); 
    } 
accession.addText(title); 
} 

這不起作用,因爲它是IllegalAddException。

+0

我無法幫到你,但是到目前爲止你所嘗試/得到的代碼/配置文件樣本可能會幫助其他人使用DOM4J來幫助你。 –

+0

@awfulHack查看更新的答案。 –

回答

3

首先,「保留」屬性與保留先前編碼字符的編碼無關 - 而是保留元素中包含的空白。該屬性通常由xml:space="preserve"屬性控制。然而,如果你的用例是你的輸入中有一個被編碼的換行符,那麼你想保存在輸出中,那麼你就有麻煩了。 DOM4J將把所有實體和字符引用解碼爲相應的Java字符(UTF-16)。這可以通過配置底層的XMLreader來部分控制,但據我所知,沒有XMLReader會報告字符引用的開始和結束 - 這些將默默地被相應的字符值所取代。

在輸出時,XMLWriter將僅對那些需要編碼的字符進行編碼,這可能是因爲XML規則或序列化時使用的編碼(例如UTF-8或ISO-8859-1等)。

在這種情況下,你基本上有兩種選擇。

1)子類XMLWriter完全替換了characters()方法,因爲處理白色空間對於此方法來說真的是內在的。沒有其他方式可以攔截製表符,換行符或回車符。在這裏,您必須以某種方式跟蹤自己的位置,並確認您正在處理正確的換行符

2)識別您希望「重新轉義」的新行字符,並用DefaultEntity("#10")節點同時將XMLWriterresolveEntityRefs財產設置爲false。此選項意味着將現有的Text節點分成兩部分,並在兩部分之間插入實體節點。

好像選項2涉及較少的工作,同時仍然繁瑣

UPDATE:

OK,看來你不能添加相同的同一實體的兩倍。如果每次工作時都添加一個新的實體實例。但是,您的情況可以通過xml:space="preserve"修復您的元素。

if (AUT.size() > 1) { 
     for (String a : AUT) { 
      accession.addText(a); 
      accession.addText("\n"); 
     } 
     accession.addText(title); 
    } 

然後

accession.addAttribute(QName.get("space", Namespace.XML_NAMESPACE), 
      "preserve"); 

在這種情況下,您明確添加換行符應該被保留,寫XML時使用的輸出格式的irregardless。

對不起,我感到困惑。

+0

#2肯定是要走的路,因爲我是添加「\ n」將我遺留數據源中的兩個不同字段合併到一個xml元素中的方法。我明天就會明白 - 非常感謝。 -Don – awfulHack

+0

@awfulHack嗯,這使得它更容易,而不是這樣一個可怕的黑客。對不起,忍不住:-) –

+0

非常感謝! – awfulHack