使用java从复杂的XML读取值

时间:2013-11-25 07:09:31

标签: java xml

我正在尝试使用JAVA读取XML文件。 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"} 

我希望其他键值也在字符串中。任何人都可以帮助并修复我的代码

3 个答案:

答案 0 :(得分:1)

你正在使用

testcase.getChild("parameter")

getChild()返回具有给定名称的第一个子元素。你想要所有名为“参数”的孩子。所以你需要打电话

testcase.getChildren("parameter")

并遍历所有返回的元素。

答案 1 :(得分:0)

使用Xpath这将帮助您从xml中读取许多复杂的表达式。

写一个xslt,它将把你的xml作为输入并渲染你的json。 Xslt也支持if循环。这也是时间有效的。我在100毫秒内解析了一个大小为3 MB的xml(我在xslt中执行了数百次操作)

答案 2 :(得分: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);
            }

我认为这将解决我的问题。