从父级获取子节点(xml,java)

时间:2017-08-22 07:15:09

标签: java xml

更新 我专门针对某个根节点下的员工,而不是整个文档中的所有“员工”元素。我忘了在这个问题中提到这个重要的细节。对不起大家。

我找到了这个问题的答案:
getElementsByTagName

但是有了这些数据:

<one>
<two>
    <three>
        <company>

            <staff id="1001">
                <firstname>Golf</firstname>
                <lastname>4</lastname>
                <nickname>Schnecke</nickname>
                <salary>1</salary>
            </staff>
            <staff id="2001">
                <firstname>Audi</firstname>
                <lastname>R8</lastname>
                <nickname>Rennaudi</nickname>
                <salary>1111111</salary>
            </staff>
            <staff id="2002">
                <firstname>Skoda</firstname>
                <lastname>xyz</lastname>
                <nickname>xyz</nickname>
                <salary>0.1</salary>
            </staff>

        </company>
    </three>
</two>
</one>

和这段代码:

public static void parseXML2() {
    File fXmlFile = new File("src\\main\\java\\staff.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = null;
    try {
        dBuilder = dbFactory.newDocumentBuilder();
    } catch (ParserConfigurationException ex) {
        Logger.getLogger(MyParser.class.getName()).log(Level.SEVERE, null, ex);
    }
        Document doc = null;
    try {
        doc = dBuilder.parse(fXmlFile);
    } catch (SAXException ex) {
        Logger.getLogger(MyParser.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(MyParser.class.getName()).log(Level.SEVERE, null, ex);
    }
    System.out.println("test");
       System.out.println(doc.getElementsByTagName("company").item(0).getTextContent());

}

我不仅仅得到一个职员要素,而是全部。怎么样? 我期待得到:

                Golf
                4
                Schnecke
                1

但我得到了这个:

                Golf
                4
                Schnecke
                1


                Audi
                R8
                Rennaudi
                1111111


                Skoda
                xyz
                xyz
                0.1

看起来您的帖子主要是代码,请添加更多详细信息...是的,详情就在那里。

3 个答案:

答案 0 :(得分:0)

您有一行代码可以从第一家公司获取文本内容。

 System.out.println(doc.getElementsByTagName("company").item(0).getTextContent());

这将获取第一个公司节点中的所有文本内容,在本例中是3个staff元素中的数据。如果要选择第一个staff元素,可以按名称选择,也可以通过获取公司的第一个子元素。

答案 1 :(得分:0)

你快到了。如果要获取第一个staff节点的文本内容,请通过 标记名称获取元素:

System.out.println(doc.getElementsByTagName("staff").item(0).getTextContent());
                                         // ^^^^^^

更新

如果您想要获取staff下的第一个company节点,那么您可以通过节点类型和节点名称检查找到它们。这是一个基本的循环:

    Node companyNode = doc.getElementsByTagName("company").item(0);
    NodeList companyChildNodes = companyNode.getChildNodes();
    for (int i = 0; i < companyChildNodes.getLength(); i++) {
        Node node = companyChildNodes.item(i);
        if (node.getNodeType() == Node.ELEMENT_NODE && Objects.equals("staff", node.getNodeName())) {
            System.out.println(node.getTextContent());
            break;
        }
    }

您可能希望将for循环重构为单独的方法。

您也可以使用XPATH。我认为它更简洁:

    XPathFactory xPathfactory = XPathFactory.newInstance();
    XPath xpath = xPathfactory.newXPath();
    XPathExpression expr = xpath.compile("//company/staff[1]");
    NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
    System.out.println(nl.item(0).getTextContent());

说明:

  • //company选择所有公司代码,无论它们在xml中的位置如何。 //忽略了xml结构的其余部分。
  • //company/staff选择staff标记下的所有company代码。
  • [0]选择第一个此类项目。

答案 2 :(得分:0)

如果您的xml具有您提到的格式,并且使用此行代码,

System.out.println(doc.getElementsByTagName("company").item(0).getTextContent();

您正在打印COMPANY标签名称下的所有内容,因此它将在公司中打印一切,如果您想选择仅打印第一名员工,请将sysout中的标记名更改为&#34;人员&#34;和项目变量为(0,1,2,3 - &gt;希望员工的索引)

System.out.println(doc.getElementsByTagName("staff").item(0).getTextContent();

我没有尝试过这个,但我认为它会起作用