1

以下の XML 構造の属性「AdvancedAlgorithm」を使用して、XML コース タグ名の 2 番目の属性値を取得するにはどうすればよいですか。

<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 に 2 つのコース タグがあることを考えると、それは本当ですか?しかし、NodeList ノードに Element 要素の ChildNodes を割り当て、NodeList ノードの長さを確認すると、わかりました。ノードには 5 つのサブノードがあるため、5 ではなく 11 でした。私の懸念は、まず、この XML 構造の長さを知りたいことと、2 番目の .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、親としてどこかに「AdvancedAlgorithm」という名前のコースがある限り、ドキュメント内のすべての「Teacher」要素を見つけることを意味します。

//course[@name='AdvancedAlgorithm']/courseは単一の値「AlgorithmForBeginners」を生成します。これは、直接の親として「AdvancedAlgorithm」という名前のコースを持つすべてのコースを要求するためです。

この式//course[@name='AdvancedAlgorithm']/course[@name='AlgorithmForBeginners']/Teacherは、「AdvancedAlgorithm」という名前のコースである直接の親を持つ「AlgorithmForBeginners」という名前のすべてのコースを検索し、Teacher直接の子であるすべての要素をリストします。

「AlgorithmForBeginners」という名前のコースのすべての教師を検索するには//course[@name='AlgorithmForBeginners']/Teacher、直接の子供または//course[@name='AlgorithmForBeginners']//Teacher任意の子供 (直接または間接) に使用します。

それはあなたが探していたものですか?「秒の属性値」が何を意味するのかわかりません。

于 2013-03-14T23:26:58.837 に答える