2010-10-07 70 views
9

我正在使用Transform對象來保存我的XML文件,但似乎刪除了空的文本節點。有什麼方法可以創建(並保留)帶有空字符串的文本節點,即「」。如何使用空字符串值創建XML文本節點(以Java編程)

這裏是我創建節點:

Element type = doc.createElement("TYPE"); 

type.appendChild(doc.createTextNode(value)); 

它只是有時value爲空字符串「」。當我看XML使用文本編輯器我看到

<TYPE /> 

,而不是

<TYPE></TYPE> 

我看了這個XML文件後回來,並遍歷節點<TYPE>元素根本不具備任何孩子,即使我明確地爲它創建了一個#text節點!

編輯 - 感恩節快樂(我的加拿大同胞)

重要說明,我不是從一組已知的標記工作,而我的工作程序採用文本節點的存在來分配JTextField到GUI。只是有時候該字段留空(不爲空,但是「」)。當我存儲該字段,然後將其讀回時,由於沒有文本節點,因此GUI不再顯示JTextField。所以我正在研究如何創建一個XML文檔,該文檔創建一個文本節點,即使它沒有任何內容。如果這不能用XML完成,那麼我將不得不使用一個屬性來標記可編輯的標籤(有點像Andrey Breslav建議的),因此應該分配一個JTextField

我會嘗試Mads Hansen提出的一個不會破壞的空間。

+1

相當於 2010-10-07 20:19:14

回答

14

沒有文字文本節點不是文本節點

如果您試圖控制如何對XML元素進行序列化,則<TYPE/><TYPE></TYPE>是等同的,如果使用了其中一個,則對於XML處理器無關緊要。兩者都聲明一個沒有任何text()的TYPE元素。大多數處理器會將空元素序列化爲自閉元素。

如果你真的想避免的元件將被序列化爲自閉,你可以得到可愛,並添加零寬度空格作爲文本節點值:<TYPE>&#x200B;</TYPE>這將是這樣的:<TYPE></TYPE>

它在技術上並不是一個「空」字符串,但可能實現你想要的,並且如果選擇和使用文本節點,將不會填充空格。

+0

這正是我想要的。我不得不改變我的焦點偵聽器,用&#x200B;替換空字符串。但那是微不足道的。唯一的一個主要缺點是,如果有人手動編輯XML文件並忘記在空字段中放置一個不間斷的空間,它會弄亂我的GUI - 但我可以忍受那:) – BigMac66 2010-10-12 12:16:38

1

我會去一個字符串屬性,而不是標籤內容。另一種選擇是使用內容,但在內容爲空字符串的情況下放置一個屬性。

+0

我試過這個,它確實有效,但是使XML文件大約大20%,並且看上去不正確的IMO。 – BigMac66 2010-10-12 12:20:00

0

如果您考慮XML specs,則在一組有效的字符中沒有真正定義空字符串「'。所以文檔生成器可能會忽略任何無效的字符。

4

從XML的角度來看,<TYPE/><TYPE></TYPE>之間沒有區別。這兩個都是等價的,可以互換使用。對於XML解析器來說,它意味着沒有文本。解析器不區分「沒有文本」和「零長度文本」。

相反,Java的null""是完全不同的概念。

所以,如果你想從Java值映射到XML,反之亦然,你必須處理這種不匹配。還有幾種可能的選擇。例如,您可以放棄您的字符串變量的null值。然後你必須確保所有的String變量都是用空字符串初始化的。或者你可以說一個沒有文本子元素的TYPE元素(序列化爲<TYPE/><TYPE></TYPE>)表示Java中的空字符串,缺少TYPE元素代表null。這是你的選擇。

2

這裏是你正在尋找什麼樣的代碼:

try{ 
    DocumentBuilderFactory docFactory=DocumentBuilderFactory.newInstance(); 
    DocumentBuilder docBuilder=docFactory.newDocumentBuilder(); 

    //root Elements -- Response 
    Document doc=docBuilder.newDocument(); 
    doc.setXmlStandalone(true); 
    Element response=doc.createElement("Data"); 
    doc.appendChild(response); 

    // Child Element -- Play 
    Element hangup=doc.createElement("Type"); 
    response.appendChild(hangup); 

    //Writer the content into xml file 
    TransformerFactory transformerFactory=TransformerFactory.newInstance(); 
    Transformer transformer=transformerFactory.newTransformer(); 
    transformer.setOutputProperty(OutputKeys.INDENT,"yes"); 

    DOMSource source=new DOMSource(doc); 
    StreamResult result=new StreamResult(sayOut); 
    //StreamResult result=new StreamResult(System.out); 

    transformer.transform(source,result); 
    logger.info("===========XML GENERATION DON FOR HANGUP============"); 

}catch(ParserConfigurationException pce){ 
    logger.error(" ==============2======== ERROR IN PRASERCONFIGURATION ==================================="); 
    pce.printStackTrace(); 
} 

輸出端產生通過它:

<?xml version="1.0" encoding="UTF-8"?> 
<Data> 
<Type/> 
</Data> 

希望我已經給了正確的事情......但我與<Type/>或同意關於XML Parser,<Type></Type>沒有區別。

相關問題