1

请问,如何在下面的 XML 结构中使用属性“AdvancedAlgorithm”获取 XML 课程标签名称中第二个的属性值:

<course name="AdvancedAlgorithm">
    <Teacher name="Francis" class="A" />
    <Teacher name="John" class="B" />
    <Teacher name="Philips" class="C" />
    <course name="AlgorithmForBeginners">
        <Teacher name="Simon" class="E" />
        <Teacher name="Joan" class="F" />
    </course>
    <Teacher name="Edward" class="M" />
</course>

我尝试了各种方法来获取它,但不知何故它首先给了我一个错误的长度和一个错误的值。我在下面的代码中做错了什么?

 public void getStructure(NodeList list){

    for(int i= 0;i<list.getLength();i++){
        Element element = (Element)list.item(i);
           if(element.getNodeType()==Node.ELEMENT_NODE && element.getAttribute("name").equals("AdvancedAlgorithm"))
         {
                NodeList node = element.getChildNodes(); //get the child elements
                System.out.println(node.getLength());
                for(int k=0; k<node.getLength();k++){
                    Node currentNode = node.item(i);
                    Element e = (Element)currentNode;
                    System.out.println(e.getAttribute("name"));

            }

         }
    }

我的分析:NodeList 列表的长度为 2。鉴于 XML 有两个 course 标签,但当我将 Element 元素的 ChildNodes 分配给 NodeList 节点并检查 NodeList 节点的长度时,这是真的吗,我发现它是 11 而不是 5,因为该节点有 5 个子节点。我关心的是,首先,我想知道这个 XML 结构的长度是多少,其次,如何检索第二个 . 谢谢

4

1 回答 1

2

我不确定你到底想做什么,但 XPath 可能会解决这个问题。下面是一个使用您提供的 XML 片段的快速示例:

public static void main(String[] args) throws UnsupportedEncodingException, ParserConfigurationException, SAXException, IOException, XPathExpressionException {
    final String xml = "<course name=\"AdvancedAlgorithm\">\n"
            + "    <Teacher name=\"Francis\" class=\"A\" />\n"
            + "    <Teacher name=\"John\" class=\"B\" />\n"
            + "    <Teacher name=\"Philips\" class=\"C\" />\n"
            + "    <course name=\"AlgorithmForBeginners\">\n"
            + "        <Teacher name=\"Simon\" class=\"E\" />\n"
            + "        <Teacher name=\"Joan\" class=\"F\" />\n"
            + "    </course>\n"
            + "    <Teacher name=\"Edward\" class=\"M\" />\n"
            + "</course>";
    final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
    final XPath xPath = XPathFactory.newInstance().newXPath();
    final XPathExpression expression = xPath.compile("//course[@name='AdvancedAlgorithm']//Teacher");

    final NodeList nodeList = (NodeList) expression.evaluate(doc, XPathConstants.NODESET);

    for (int i = 0; i < nodeList.getLength(); ++i) {
        System.out.println(((Element)nodeList.item(i)).getAttribute("name"));
    }
}

输出:

Francis
John
Philips
Simon
Joan
Edward

因此,Document然而(String在这种情况下是从)构建的,然后我们创建并编译一个XPathExpression. 这个表达式 ,//course[@name='AdvancedAlgorithm']//Teacher意味着找到文档中的所有“Teacher”元素,无论它们在哪里,只要它们在某处有一个名为“AdvancedAlgorithm”的课程作为父级。

表达式//course[@name='AdvancedAlgorithm']/course将产生一个值“AlgorithmForBeginners”,因为这要求所有课程名称为“AdvancedAlgorithm”的课程作为直接父级。

该表达式//course[@name='AdvancedAlgorithm']/course[@name='AlgorithmForBeginners']/Teacher将查找所有名为“AlgorithmForBeginners”的课程,其直接父项是名为“AdvancedAlgorithm”的课程,并列出所有Teacher直接子项的元素。

要查找名为“AlgorithmForBeginners”的任何课程的所有教师,您可以将//course[@name='AlgorithmForBeginners']/Teacher其用于直接孩子或//course[@name='AlgorithmForBeginners']//Teacher任何孩子,即直接或间接。

那是你要找的吗?我不确定“第二个属性值”是什么意思。

于 2013-03-14T23:26:58.837 回答