Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取节点列表中每个节点的第一个子节点的值?_Java_Xml_Dom_Xmlnodelist - Fatal编程技术网

Java 如何获取节点列表中每个节点的第一个子节点的值?

Java 如何获取节点列表中每个节点的第一个子节点的值?,java,xml,dom,xmlnodelist,Java,Xml,Dom,Xmlnodelist,我想获取每个元素的第一个子元素的名称和值。但我得到的是空值。我对XML非常陌生,我很困惑,只是想用漂亮的字体做点什么。根目录中大约有15个子目录,它们都叫做DEvent,我希望我的输出是: 活动:星期三徒步旅行 活动:鞠躬-狗屎 等等 我的java代码将显示结果- Element DNR = root; NodeList EventList=DNR.getElementsByTagName("DEvent"); for (int i=0; i< EventL

我想获取每个元素的第一个子元素的名称和值。但我得到的是空值。我对XML非常陌生,我很困惑,只是想用漂亮的字体做点什么。根目录中大约有15个子目录,它们都叫做DEvent,我希望我的输出是:

活动:星期三徒步旅行

活动:鞠躬-狗屎

等等

我的java代码将显示结果-

Element DNR = root;
        NodeList EventList=DNR.getElementsByTagName("DEvent");
        for (int i=0; i< EventList.getLength();i++)
        {
            Node thisNode = EventList.item(i);
            Node child = thisNode.getFirstChild();
            String x = child.getNodeValue();
            System.out.println(thisNode+ x);
        }

下面是一个工作示例。代码中的第一个子节点是文本节点,您需要获取该节点的下一个子节点,以便事件节点毕竟不是第一个节点:

    import org.w3c.dom.*;
    import java.io.*;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.DocumentBuilder;

    File xmlFile = new File("/data/test/test.xml");
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(xmlFile);

    NodeList eventList = doc.getElementsByTagName("DEvent");
    for (int i=0; i< eventList.getLength(); i++) {
        Node thisNode = eventList.item(i);

        if(thisNode.hasChildNodes()){
            NodeList event = thisNode.getChildNodes().getFirstChild().getNextSibling();
            String eid = event.getAttributes().getNamedItem("eid");
            String value = event.getFirstChild().getNodeValue();
            System.out.println("EID: " + eid + " Value: " + value + "\n");
        }
    }
话虽如此,我认为更好的实现是使用XPath,它允许您选择所需的节点,而无需手动遍历树,而且更紧凑且“故障安全”:

    XPath xpath = XPathFactory.newInstance().newXPath();
    String expression = "/DNREvents/DEvent/event";
    InputSource inputSource = new InputSource(new BufferedReader(new FileReader("/data/test/test.xml")));
    NodeList eventList = (NodeList) xpath.evaluate(expression, inputSource, XPathConstants.NODESET);

    for (int i=0; i< eventList.getLength(); i++) {
        Node eventNode = eventList.item(i);

        String eid = xpath.evaluate("@eid", eventNode);
        String value = xpath.evaluate("./text()", eventNode);
        System.out.println("EID: " + eid + ", Value: " + value + "\n");
    }

什么是空的?节点列表或单个节点?I get[DEvent:null]元素DNR不为null?元素DNR显示为与节点类似的[DNREvents:null]。请不要以大写字母开头命名变量。用例:酷!我应该使用什么值来获取每个元素名称devent?我仍然使用'child'或'thisNode'从您的代码中获得[event:null]查看我使用XPath的最新更新。您可以更改表达式以满足您的需要。下面是JavadocforXPath:这是一个使用XPath从XML中选择所需数据的非常好的示例:非常感谢!我必须回到神话时代,我看到了你的照片:DOK,我更新了DOM示例,以从事件中获取eid值。
NodeList child = thisNode.getChildNodes().getFirstChild().getNextSibling();
    XPath xpath = XPathFactory.newInstance().newXPath();
    String expression = "/DNREvents/DEvent/event";
    InputSource inputSource = new InputSource(new BufferedReader(new FileReader("/data/test/test.xml")));
    NodeList eventList = (NodeList) xpath.evaluate(expression, inputSource, XPathConstants.NODESET);

    for (int i=0; i< eventList.getLength(); i++) {
        Node eventNode = eventList.item(i);

        String eid = xpath.evaluate("@eid", eventNode);
        String value = xpath.evaluate("./text()", eventNode);
        System.out.println("EID: " + eid + ", Value: " + value + "\n");
    }