简体   繁体   English

使用java从复杂的xml中读取值

[英]Read values from a complex xml using java

HI I am new to Java and trying to read an XML file. 我是Java新手并尝试读取XML文件。 Here is my XML file :- 这是我的XML文件: -

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

Here is my code I am trying to read the key and value from the xml but I am stuck .Here is my code :- 这是我的代码我试图从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


            }
        }
    }
}

Can anyone please help me with this 任何人都可以帮我这个

your code read <testCaseDataName> node. 您的代码读取<testCaseDataName>节点。 it is not go inside of this tag. 它不会进入这个标签。 so try this.. 所以试试这个..

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

Disclaimer: I maintain the JDOM project , so I am biased.... but... this is an ideal use case for JDOM: 免责声明:我维护JDOM项目 ,所以我有偏见....但是......这是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());
    }

For me this produces the output 对我来说,这会产生输出

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}

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

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