2013-11-22 26 views
0

HI我是Java的新手,嘗試讀取XML文件。 這裏是我的XML文件: -使用java從複雜的xml中讀取值

<?xml version="1.0" encoding="UTF-8"?> 
    <parameter> 
<attribute>a</attribute> 

這裏是我的代碼,我想讀從XML密鑰和價值,但我堅持。這裏是我的代碼: -

public class TestDBMain { 

    public static void main(String[] args) throws Exception { 
     // TODO Auto-generated method stub 
     File file = new File("ACL.xml"); 
     DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = dbfactory.newDocumentBuilder(); 
     Document doc = builder.parse(file); 
     NodeList nList = doc.getElementsByTagName("testCaseDataName"); 
     for(int i = 0;i<nList.getLength();i++){ 
      Node nNode = nList.item(i); 
      if(nNode.getNodeType()== Node.ELEMENT_NODE){ 
       Element ele = (Element) nNode; 
      // System.out.println(ele.getTextContent()); 
       //System.out.println(ele.getElementsByTagName("testCaseName").item(0).getTextContent()); 
       System.out.println(ele.getAttributeNode("testCaseDataName")); 
//I dont know which methods to use to print the key and value in the xml under parameter 


      } 
     } 
    } 
} 

燦任何人請幫我這個

+0

嘗試使用jaxb上下文 –

回答

1

聲明:我保持JDOM project,所以我有偏見....但...這是一種理想的用例JDOM:

Document doc = new SAXBuilder().build(new File("ACL.xml")); 
    Element root = doc.getRootElement(); 
    for (Element testcase : root.getChildren()) { 
     int id = Integer.parseInt(testcase.getChildText("id")); 
     String name = testcase.getChildText("testCaseName"); 
     String expect = testcase.getChildText("expectedResult"); 
     Map<String,String> params = new LinkedHashMap<String,String>(); 
     Element parmemt = testcase.getChild("parameter"); 
     if (parmemt != null) { 
      Iterator<Element> it = parmemt.getChildren().iterator(); 
      while (it.hasNext()) { 
       Element key = it.next(); 
       if (!"key".equals(key.getName())) { 
        throw new IllegalStateException("Expected key but got " + key); 
       } 
       if (!it.hasNext()) { 
        throw new IllegalStateException("Expected value for key " + key); 
       } 
       Element val = it.next(); 
       if (!"value".equals(val.getName())) { 
        throw new IllegalStateException("Expected value but got " + val); 
       } 
       params.put(key.getValue(), val.getValue()); 
      } 
     } 
     System.out.printf("Processing test case %d -> %s\n Expect %s\n Parameters: %s\n", 
      id, name, expect, params.toString()); 
    } 

對我來說這產生輸出

Processing test case 1 -> EditTest 
    Expect nooptionsacltrue 
    Parameters: {} 
Processing test case 2 -> AddTest 
    Expect featuresaddedacltrue 
    Parameters: {featues=w,f} 
Processing test case 3 -> AddTest 
    Expect duplicateacltrue 
    Parameters: {projectType=NEW, Name=28HPM, status=ACTIVE, canOrder=Yes} 
+0

我下載了二進制文件。我應該輸入什麼罐子? – Newbie

+1

所有你需要的是jdom-2.0.5.jar ...並閱讀它:https://github.com/hunterhacker/jdom/wiki/JDOM2-A-Primer – rolfl

1

你的代碼讀取<testCaseDataName>節點。它不在這個標籤裏面。 所以試試這個..

for(int i = 0;i<nList.getLength();i++){ 
     NodeList nodeList = nList.item(i).getChildNodes(); 
     for(int j = 0;j<nList.getLength();j++){ 
      Node nNode = nodeList.item(j); 
      if(nNode.getNodeType()== Node.ELEMENT_NODE){ 
       System.out.println(nNode.getNodeName() +" : "+nNode.getTextContent()); 
       if(nNode.getNodeName().equals("parameter")){ 
        NodeList param = nNode.getChildNodes(); 
        System.out.println("  "+param.item(0).getNodeName() +" : "+param.item(0).getTextContent()); 
        System.out.println("  "+param.item(1).getNodeName() +" : "+param.item(1).getTextContent()); 
       } 
      } 
     } 
    } 
+0

這只是打印id。我想打印關鍵值標記 – Newbie

+0

,所以又走了一步.. – subash

+0

看到我的答案..但我明確告訴索引。所以根據你的邏輯改變 – subash