2013-09-26 98 views
1

我有以下xml ..我試圖解析它。xml不解析在java

<employee> 
    <personal> 
     <id>2D61EC47-0F56-5A33-6057-54DB0ABBDBF0</id> 
     <name>Lareina</name> 
     <age>50</age> 
    </personal> 
    <contact> 
     <dept>Fusce</dept> 
     <manager>CB9A0BB76</manager> 
    </contact> 
</employee> 

但是...嗯...我不能這樣做.. 發佈我的代碼..但我的代碼適用於「正確」的格式化XML關係嗎? (取消註釋「xmlString」)

public class XMLReader { 
    public static void main(String[] args) throws JDOMException, IOException { 

     //String xmlString = "<employee >\n <firstname xml:space=\"preserve\" >John</firstname>\n <lastname>Watson</lastname>\n <age>30</age>\n <email>[email protected]</email>\n</employee>"; 
     String xmlString = "<employee>\n" + 
       "  <personal><id>2D61EC47-0F56-5A33-6057-54DB0ABBDBF0</id>\n" + 
       "  <name>Lareina</name>\n" + 
       "  <age>50</age>\n" + 
       "  </personal><contact><dept>Fusce</dept>\n" + 
       "  <manager>B55E6DA8-76BD-A3C8-2DDF-686CB9A0BB76</manager></contact>\n" + 
       " </employee>"; 
     System.out.println(xmlString); 


     SAXBuilder builder = new SAXBuilder(); 
     Reader in = new StringReader(xmlString); 

     Document doc = builder.build(in); 
     Element root = doc.getRootElement(); 
     List children = root.getChildren(); 
     //System.out.println(children); 
     String value = ""; 
     for (int i = 0; i < children.size(); i++) { 

       Element dataNode = (Element) children.get(i); 
       // Element dataNode = (Element) dataNodes.get(j); 
       value += ", " +dataNode.getText().trim(); 
       System.out.println(dataNode.getName() + " : " + dataNode.getText()); 

       //context.write(new Text(rowKey.toString()), new Text(node.getName().trim() + " " + node.getText().trim())); 

      } 
     //System.out.println(in); 



    } 
} 
+0

我沒有評論這段代碼,它對我來說工作的很好。 –

+0

@SotiriosDelimanolis:哪個代碼?它工作正常與未註釋的「xmlString」,但我給了一個xml ..是否有效? – Fraz

+0

而不是手動解析XML,請使用JAXB或類似的POJO-XML編組庫。它只需要幾行代碼就可以輕鬆地在Java對象和XML之間進行轉換。 – rob

回答

2

您的兩個xml字符串是不同的。第一種是

<employee> 
    <firstname xml:space="preserve">John</firstname> 
    <lastname>Watson</lastname> 
    <age>30</age> 
    <email>[email protected]</email> 
</employee> 

其中有四(4)個孩子,每個孩子都有文字。所以它打印

firstname : John 
lastname : Watson 
age : 30 
email : [email protected] 

而第二個是

<employee> 
    <personal> 
     <id>2D61EC47-0F56-5A33-6057-54DB0ABBDBF0</id> 
     <name>Lareina</name> 
     <age>50</age> 
    </personal> 
    <contact> 
     <dept>Fusce</dept> 
     <manager>B55E6DA8-76BD-A3C8-2DDF-686CB9A0BB76</manager> 
    </contact> 
</employee> 

在這最後一個,你會得到兩個孩子personalcontact它們沒有什麼文字。所以你得到的輸出像

personal : 



contact : 

這是預期的輸出。

+0

所以我想,有沒有辦法讓「 2D61EC47-0F56-5A33-6057-54DB0ABBDBF0 Lareina 」作爲個人的價值? – Fraz

+0

不,這不是HTML,並且沒有'inner-xml'功能。解析後只有元素樹。每個節點都包含子節點,這些節點可以是元素或文本(以及某些其他類型,如屬性,PI)。如果您需要將子樹表示爲序列化的XML(即您顯示的字符串),則必須親自序列化它。 –

+0

當然。 'Element'類有一個'getChild(name)'方法。您可以在根上執行'getChild(「personal」)'並遍歷子元素。我建議你使用XPath來解析xml。 –