2013-11-25 15 views
1

我正在嘗試使用JAVA讀取XML文件。 XML文件: - <使用java讀取複雜XML中的值

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


<document> 
<testCaseDataName> 
    <id>1</id > 
    <testCaseName>EditTest</testCaseName > 
    <expectedResult>true</expectedResult > 

</testCaseDataName> 
<testCaseDataName> 
    <id>2</id > 
    <testCaseName>AddTest</testCaseName > 
    <expectedResult>true</expectedResult> 
    <parameter> 
    <key>featues</key > 
    <value>new</value> 
    </parameter> 
</testCaseDataName> 

    <testCaseDataName> 
    <id>3</id > 
    <testCaseName>AddTest</testCaseName > 
    <expectedResult>true</expectedResult> 
    <parameter> 
    <key>projectType</key > 
    <value>old</value> 
    </parameter> 
    <parameter> 
    <key>Name</key > 
    <value>Marvel</value> 
    </parameter> 
    <parameter> 
    <key>status</key > 
    <value>ACTIVE</value> 
    </parameter> 
    <parameter> 
    <key>canOrder</key > 
    <value>Yes</value> 
    </parameter> 
</testCaseDataName> 
<testCaseDataName> 
    <id>4</id > 
    <testCaseName>AddTest</testCaseName > 
    <expectedResult>empty</expectedResult> 
    <parameter> 
    <key>projectType</key > 
    <value>GEN</value> 
    </parameter> 
    <parameter> 
    <key>Name</key > 
    <value>HPM</value> 
    </parameter> 
    <key>no status</key > 
    <value>ACTIVE</value> 
    <parameter> 
    <key>canOrder</key > 
    <value>Yes</value> 
    </parameter> 
</testCaseDataName> 

</document> 

我想讀從參數到一個HashMap中的鍵和值。這裏是我的代碼: -

public class JDOM { 

    public static void main(String[] args) throws JDOMException, IOException { 
     // TODO Auto-generated method stub 
     File xsdfile = new File("file.xsd"); 
     XMLReaderJDOMFactory schemafac = new XMLReaderXSDFactory(xsdfile); 
     SAXBuilder builder = new SAXBuilder(schemafac); 
     //Document doc = new SAXBuilder().build(new File("testdbcsv/ACL.xml")); 
     Document doc = builder.build(new File("file.xml")); 
     Element root = doc.getRootElement(); 
     for (Element testcase : root.getChildren()) { 
      String id = testcase.getChildText("id"); 
      String testCaseName = testcase.getChildText("testCaseName"); 
      String expectedResult = testcase.getChildText("expectedResult"); 
      System.out.println(expectedResult); 
      HashMap<String,String> parameters = new LinkedHashMap<String,String>(); 
      Element params = testcase.getChild("parameter"); 
      System.out.println(params); 
      if (params != null) { 
       Iterator<Element> it = params.getChildren().iterator(); 
       while (it.hasNext()) { 
        Element key = it.next(); 
        Element val = it.next(); 
        parameters.put(key.getValue(), val.getValue()); 
       } 
      } 
      parameters.put("expectedResult", expectedResult); 
      ObjectMapper obj = new ObjectMapper(); 
      String jsonString = obj.writeValueAsString(parameters); 
      System.out.println(jsonString); 

     } 
     } 
    } 

我的代碼只讀取第一套鍵和值,而不讀取其他鍵和值。 輸出是: -

{"expectedResult":"true"} 
{"featues":"w,f","expectedResult":"true"} 
{"projectType":"MEMOGEN","expectedResult":"true"} 
{"projectType":"MEMOGEN","expectedResult":"empty"} 

我想其他的鍵值也成爲的字符串中。任何人都可以請幫助和修復我的代碼

+0

任何人都可以回答這個問題嗎? 急需 [http://stackoverflow.com/questions/24757825/how-to-read-xml-attribute-values-hierarchically-like-parentnodename-childnodeatt][1] [1 ]:http://stackoverflow.com/questions/24757825/how-to-read-xml-attribute-values-hierarchically-like-parentnodename-childnodeatt –

+0

看看我的答案在下面。它應該幫助你 – Newbie

回答

0
List<Element> params = testcase.getChildren("parameter"); 
      for(Element ele : params){ 
       String key = ele.getChildText("key"); 
       String value = ele.getChildText("value"); 
       parameters.put(key, value); 
      } 

我認爲這會解決我的問題。

0

使用Xpath這將幫助您從XML讀取許多複雜的表達式。

寫一個xslt,它將把你的xml作爲輸入並呈現你的json。 Xslt支持,如果循環以及。這也是時間效率。我在100毫秒解析大小的XML 3 MB(我進行了數百個業務內部XSLT)

+0

我只想繼續使用JDOM。請你能幫助我如何閱讀其他參數。 – Newbie

+1

當你已經說過你是新手,並且有人提出了採用不同方法的有用建議時,那麼說出爲什麼你不認爲這種方法符合你的要求是有禮貌的。 –

1

您使用

testcase.getChild("parameter") 

getChild()返回給定的名字第一子元素。你想要所有名爲「參數」的孩子。因此,您需要致電

testcase.getChildren("parameter") 

並遍歷所有返回的元素。

+0

它返回一個參數子項的列表,我應該重複它的權利? – Newbie

+0

你能幫我解釋一下嗎? – Newbie

+1

是的。閱讀javadoc:http://www.jdom.org/docs/apidocs/org/jdom2/Element.html#getChildren%28java.lang.String%29 –