1

同じタグ名を持つ XML ドキュメントを解析する必要があります。私がやりたいことを確認するために、このコードのサンプルを提供します。

<SystemData>
    <SystemName>xmlexample</SystemName>
    <Schools>
        <School>
            <SchoolName>SCHOOL1</SchoolName>
            <Classes>
                <Class>
                    <ClassName>ACLASS</ClassName>
                </Class>
            </Classes>
            <Classes>
                <Class>
                    <ClassName>BCLASS</ClassName>
                </Class>
            </Classes>
        </School>

        <School>
            <SchoolName>SCHOOL2</SchoolName>
            <Classes>
                <Class>
                    <ClassName>CCLASS</ClassName>
                </Class>
            </Classes>
        </School>
    </Schools>
</SystemData>

私が望む結果は次のとおりです。

SCHOOL1
ACLASS
BCLASS

SCHOOL2
CCLASS

私はforループを試していますが、すべての学校のすべてのクラスで取得できます。

これまでの私のコード:

NodeList schoolist = doc.getElementsByTagName("School");
int num = schoolist.getLength();

for (int temp = 0; temp < num; temp++) {
    Node nNode = schoolist.item(temp);
    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
        Element eElement = (Element) schoolist.item(temp);
        Node schoolname = eElement.getFirstChild();

        System.out.println("schoolname: " + eElement.getElementsByTagName("ClassName").item(0).getTextContent());
    }

    NodeList Classlist = doc.getElementsByTagName("Method");
    int num1 = Classlist.getLength();

    for (int i = 0; i < num1; i++) {

        Node nNode1 = Classlist.item(i);

        if (nNode1.getNodeType() == Node.ELEMENT_NODE) {
            Element eElement1 = (Element) Classlist.item(i);
            Node Classname = eElement1.getFirstChild();
            System.out.println("Classname: " + eElement1.getElementsByTagName("ClassName").item(0).getTextContent());

        }
    }
}
4

3 に答える 3

1

だから最終的に私はコードを修正することができました..これがどのように機能するかです..

        NodeList listOfSchool = doc.getElementsByTagName("School");


            for(int s=0; s<listOfSchool.getLength() ; s++){


                Node firstSchoolNode = listOfSchool.item(s);
                if(firstSchoolNode .getNodeType() == Node.ELEMENT_NODE){


                    Element SchoolElement = (Element)firstSchoolNode ;

                    //-------
                    NodeList SchoolNameList = SchoolElement.getElementsByTagName("SchoolName");
                    Element SchoolNameElement = (Element)SchoolNameList .item(0);

                    NodeList textFNList = SchoolNameElement.getChildNodes();
                    System.out.println("School Name : " + 
                           ((Node)textFNList.item(0)).getNodeValue().trim());

                        //----

                   NodeList listOfSchoolNames = SchoolElement.getElementsByTagName("Class");

                    for(int i=0; i<listOfSchoolNames.getLength() ; i++){


                Node firstClassNode = listOfSchoolNames.item(i);
                 if(firstClassNode .getNodeType() == Node.ELEMENT_NODE){

                    Element classElement = (Element)firstClassNode;
                    //----

                        NodeList ClassNameList = classElement .getElementsByTagName("ClassName");


                        Element ClassNameElement = (Element)ClassNameList.item(0);

                         NodeList textCLSNMList = ClassNameElement.getChildNodes();
                           System.out.println("class Name : " + 
                           ((Node)textCLSNMList .item(0)).getNodeValue().trim());

                           }
}
于 2013-02-03T14:56:16.460 に答える
0

コードを読みやすく、保守しやすくするjavax.xml.xpath代わりに、JavaSE5以降のAPIを使用することをお勧めします。getElementsByTagName

import javax.xml.xpath.*;
import org.w3c.dom.*;
import org.xml.sax.InputSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        XPathFactory xpf = XPathFactory.newInstance();
        XPath xPath = xpf.newXPath();
        XPathExpression schoolNameExpression = xPath.compile("SchoolName");
        XPathExpression classNameExpression = xPath.compile("Classes/Class/ClassName");

        InputSource inputSource = new InputSource("src/forum14671896/input.xml");
        NodeList schoolNodes = (NodeList) xPath.evaluate("/SystemData/Schools/School", inputSource, XPathConstants.NODESET);
        for(int x=0; x<schoolNodes.getLength(); x++) {
            Node schoolElement = schoolNodes.item(x);

            // School Name
            System.out.print("School Name : ");
            System.out.println(schoolNameExpression.evaluate(schoolElement, XPathConstants.STRING));

            // Class Names
            NodeList classNames = (NodeList) classNameExpression.evaluate(schoolElement, XPathConstants.NODESET);
            for(int y=0; y<classNames.getLength(); y++) {
                System.out.print("Class Name : ");
                System.out.println(classNames.item(y).getTextContent());
            }
            System.out.println();
        }
    }

}

出力

School Name : SCHOOL1
Class Name : ACLASS
Class Name : BCLASS

School Name : SCHOOL2
Class Name : CCLASS
于 2013-02-04T11:30:10.387 に答える
0

タグ名に関する明らかな問題:

System.out.println("schoolname: " + eElement.getElementsByTagName("ClassName").item(0).getTextContent());

する必要があります

System.out.println("schoolname: " + eElement.getElementsByTagName("SchoolName").item(0).getTextContent());

NodeList Classlist = doc.getElementsByTagName("Method");

する必要があります

NodeList Classlist = doc.getElementsByTagName("Class");

次に、ドキュメントからすべての要素を取得するのではなく、現在の学校の子であるClassすべてのドキュメントを取得します。Class

于 2013-02-03T12:02:21.520 に答える