简体   繁体   English

使用Java从复杂的XML读取值

[英]Read values from a complex XML using java

I am trying to read a XML file using JAVA . 我正在尝试使用JAVA读取XML文件。 XML file:-< 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>

I am trying to read the key and value from parameters to a hashmap .here is my code:- 我正在尝试从参数读取哈希值的键和值,这是我的代码:-

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);

         }
        }
    }

My code is only reading the first set of key and value and not reading the other keys and values. 我的代码仅读取第一组键和值,而不读取其他键和值。 The output is :- 输出为:-

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

I want the other key value also to be in the string. 我希望其他键值也位于字符串中。 Can anyone please help and fix my code 谁能帮忙解决我的代码

You're using 您正在使用

testcase.getChild("parameter")

getChild() returns the first child element with the given name. getChild()返回具有给定名称的第一个子元素。 You want all the children named "parameter". 您想要所有名为“参数”的子级。 So you need to call 所以你需要打电话

testcase.getChildren("parameter")

and iterate through all the returned elements. 并遍历所有返回的元素。

Use Xpath This will help you to read many complex expressions from a xml. 使用Xpath这将帮助您从xml读取许多复杂的表达式。

Write a xslt which will take your xml as input and render your json. 编写一个xslt,它将您的xml作为输入并呈现json。 Xslt supports for, if loops as well. Xslt还支持if循环。 This is time efficient as well. 这也是省时的。 I have parsed an xml of size 3 MB in 100 ms (I performed hundreds of operations inside xslt) 我已经在100毫秒内解析了大小为3 MB的xml(我在xslt内执行了数百次操作)

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

I think this will solve my problem . 我认为这将解决我的问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM