2014-06-13 115 views
1

我嘗試檢索XML節點值時出現問題。沒有一點解釋就很難問這個問題。我有一個我創建的服務器 - 客戶端聊天室,服務器處理所有包含用戶用戶名的XML數據。例如,用戶發送將廣播給服務器上的每個人的消息。當消息到達服務器時,服務器將根據用戶當前的IP地址檢查陣列。如果IP位於陣列中,則具有相應編號的另一個陣列將返回用戶名,然後將其廣播給所有聊天室用戶。當新用戶或離線用戶加入服務器時,我的問題就會出現。如果IP不在陣列中,服務器將檢查一個XML文件,該文件包含所有在線用戶或舊用戶的最後一個已知IP(此部分已針對擁有新IP的舊用戶進行解析),然後服務器將其添加到陣列。這在理論上可行,但在代碼中它不會產生相同的結果。我能夠將當前IP添加到數組,但我無法獲得用戶名。我相信這是因爲用戶的舊IP是節點名稱,用戶名是節點值。 例如: Usernames.xml文件如何正確讀取XML文件中的節點值?

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<Server> 
    <i0000>User</i0000> 
    <i1921681114>Chappy</i1921681114> 
</Server> 

應該將其添加到陣列的功能:

public static void addInArray(String IPtoCheck) throws Exception{ 
     File fXmlFile = new File("Usernames.xml"); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(fXmlFile); 

     doc.getDocumentElement().normalize(); 
     NodeList nList = doc.getElementsByTagName(IPtoCheck); 
     for(int i=0; nList.getLength()>i; i++){ 
      Node nNode = nList.item(i); 
      if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
       Element eElement = (Element) nNode; 
       if(eElement.getNodeName().equals(IPtoCheck)){ 
        int used = 0; 
        while (used < 63){ 
         if(IPs[used].equals("no")){ 
          IPs[used] = IPtoCheck; 
          usernames[used] = eElement.getNodeValue(); 
          AppendArea.Apen(3, usernames[used]); 
          break; 
         } 
         used++; 
        } 
       } 
      } 
     } 
    } 

此外,我要補充的是我沒有使用

Arrays.fill(IPs, "no"); 
Arrays.fill(usernames, "no"); 

沒有表示開放陣列點

此外IPtoCheck字符串我是修改後的IP值。例如,在XML文件中的IP節點是:

i1921681114 

這其實是192.168.1.114

所有這些詳盡的解釋後,我的問題如下:

如何正確閱讀使用Java的XML文件中的節點值?

因爲eElement.getNodeValue();沒有返回正確的值,它只返回「空」

回答

2

org.w3c.dom.Element對象從來沒有一個節點值,所以它總是返回null。

你需要得到它的孩子。如果您使用:

eElement.getFirstChild().getNodeValue(); 

您將檢索元素的第一個子節點,即您想要的文本節點。

您還可以使用:

eElement.getFirstChild().getTextContent(); 

返回的元素,在這種情況下,具有相同的結果的文本內容。

如果您發現Java中的DOM API直覺相反,您可以使用其他API,如JDOM或DOM4J,或使用其他J2SE的標準方法,例如XPath。

+0

謝謝你回答我的問題!但是我只是在xml中添加了一個具有相同值的屬性,並調用.getAttribute,它的工作原理是一樣的。不管怎麼說,多謝拉! –

+0

屬性以不同的方式工作,因爲他們沒有孩子。被稱爲元素的* node value *的屬性取決於它的子元素。其他API(或實現)可以將其評估爲字符串值,並將其默認分配給元素。 – helderdarocha