简体   繁体   中英

Java: reading xml with many nested elements

I have xml that looks somewhat similar to the following. I need to get values from attributes and tags and store them. But i cant understand how to get to level 2(3,4, etc) nested elements. I use following code that i found on the internet, it uses DOM but i cant get correct RegNumber and its attributes. Thanks in advance.

 nodeList = xmldocument.getElementsByTagName("Header"); if (nodeList != null && nodeList.getLength() > 0) { for (int i = 0; i < nodeList.getLength(); i++) { //get the header element Element header = (Element) nodeList.item(i); System.out.println("Element: " + ((Element)nodeList.item(i)).getNodeName()); System.out.println(header.getAttribute("time")); } } nodeList = xmldocument.getElementsByTagName("Document"); if (nodeList != null && nodeList.getLength() > 0) { for (int i = 0; i < nodeList.getLength(); i++) { //get the document element Element document = (Element) nodeList.item(i); System.out.println("Element: " + ((Element)nodeList.item(i)).getNodeName()); System.out.println(document.getAttribute("Id")); nodeList = document.getElementsByTagName("RegNumber"); for (int j = 0; j < nodeList.getLength(); j++) { //get the RegNumber element Element regNumber = (Element) nodeList.item(j); System.out.println("Element: " + ((Element)nodeList.item(j)).getNodeName()); System.out.println(regNumber.getAttribute("regpoint")); } } } 

xml:

<XML xsi:schemaLocation="http://www.codetools.it XSD2.xsd" xmlns="http://www.codetools.it" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <Header time="2001-12-17T09:30:47Z" />
            <Document Id="456">
                <RegNumber regpoint="" regdate="2001-12-17T09:30:47Z">123/456</RegNumber>
                <Confident flag="0"/>
                <DocNumber kind="">
                    <RegNumber RegPoint="" regdate="2001-12-17T09:30:47Z">456/789</RegNumber>
                    <Organization fullname="lol" shortname="" ownership="lol" ogrn="78945612" inn="">
                        <OfficialPerson>
                            <Name  Firstname="John"/>
                            <Official Department="" post=""/>
                            <SignDate>2001-12-17T09:30:47Z</SignDate>
                        </OfficialPerson>
                        <Econtact type="1">test@test.com.ua</Econtact>
                        <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" house=""/>
                    </Organization>
                </DocNumber>
                <DocTransfer os="Windows" type=".docx" type_ver="" char_set="" description="kkkk">
    </DocTransfer>
            <Reghistory idnumber="">
                <RegNumber RegPoint="" regdate=""/>
                <Organization fullname="" shortname="" ownership="" ogrn="" inn="">
                    <Econtact type=""/>
                    <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" house=""/>
                </Organization>
            </Reghistory>
            <Author>
                <Organization fullname="" shortname="" ownership="" ogrn="12345678" inn="">
                    <OfficialPerson>
                        <Name  Firstname="" />
                        <Official Department="" post=""/>
                        <SignDate>2011-12-17T09:30:47Z</SignDate>
                    </OfficialPerson>
                    <Econtact type="Рї">smirnov@test.com</Econtact>
                    <Address street=""  postcode="1234" postbox="" flat="" district="" region="" country="" nontypical="" house="12"/>
                </Organization>
                <PrivatePerson>
                    <Name Surname="" Firstname="" Fathername=""/>
                    <Econtact type=""/>
                    <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" house=""/>
                    <SignDate/>
                    <Rank privilege="" socialposition="" sex=""/>
                </PrivatePerson>
            </Author>
            <Validator attestation="0">
                <DocNumber kind="наказ">
                    <RegNumber RegPoint="" regdate="2001-12-17T09:30:47Z"/>
                    <Organization fullname="" shortname="" ownership="" ogrn="14725836" inn="">
                        <Econtact type="Рї">kmu@test.com</Econtact>
                        <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" house=""/>
                    </Organization>
                </DocNumber>
                <Organization fullname="" shortname="РљРњРЈ" ownership="" ogrn="96325878" inn="">
                    <Econtact type="String">kmu@test.com</Econtact>
                    <Address street="Пушкіна" settlement="" postcode="4563" postbox="" flat="" district="" region="" country="" nontypical="" house="23"/>
                    <OfficialPerson>
                        <Name Surname="" Firstname="" Fathername=""/>
                        <Official Department="" post=""/>
                        <SignDate>2011-12-17T09:30:47Z</SignDate>
                    </OfficialPerson>
                </Organization>
                <PrivatePerson>
                    <Name Surname="" Firstname="" Fathername=""/>
                    <Econtact type=""></Econtact>
                    <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" house=""/>
                    <SignDate></SignDate>
                    <Rank privilege="" socialposition="" sex=""/>
                </PrivatePerson>
            </Validator>
            <Addressee>
                <Referred id="" retype="">
                    <RegNumber regdate="" regpoint=""/>
                    <TaskNumber taskDate=""/>
                </Referred>
                <Organization fullname="String" shortname="" ownership="" ogrn="85236974" inn="">
                    <OfficialPerson>
                        <Name Surname="" Firstname="" Fathername=""/>
                        <Official Department="" post=""/>
                    </OfficialPerson>
                    <Econtact type="Рї">sofki@test.com</Econtact>
                    <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" type="" house=""/>
                </Organization>
                <PrivatePerson>
                    <Name Surname="" Firstname="" Fathername=""/>
                    <Econtact type=""></Econtact>
                    <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" house=""/>
                    <Rank privilege="" socialposition="" sex=""/>
                </PrivatePerson>
            </Addressee>
            <Writer>
                <Organization fullname="" shortname="" ownership="" ogrn="" inn="">
                    <OfficialPerson>
                        <Name Surname="" Firstname="" Fathername=""/>
                        <Econtact type=""></Econtact>
                    </OfficialPerson>
                </Organization>
                <PrivatePerson>
                    <Name Surname="" Firstname="" Fathername=""/>
                    <Econtact type=""></Econtact>
                </PrivatePerson>
            </Writer>
        </Document>

edit . As advised i try to figure out JAXB thingy. xjc tool generated 3 classes: ObjectFactory, package-info, XML. I found this code to create object from xml:

public static void main(String[] args) {
        try {

            File file = new File("F:\\Untitled3.xml");
            JAXBContext jaxbContext = JAXBContext.newInstance(XML.class);

            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            XML xml = (XML) jaxbUnmarshaller.unmarshal(file);
            System.out.println(xml);

        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

Is this the correct way, or i need to use ObjectFactory?:

ObjectFactory f =new ObjectFactory();
            XML xml1 = f.createXML();

How do i create object with all tags and attributes, and then create xml file from it? Im new to java and jaxb stuff, so please bear with me.

It is usually not meaningful or commonly useful for method letting you access nodes at certain depth. This is not only about Java, but rather the DOM spec, and I believe that's the right decision.

People usually access nodes through one of many meaningful ways:

  1. Through tag name, and tag name usually indicates the meaning of the node.
  2. XPath - the meaning full structure of the document.
  3. Binding, for example JAXB (basically you are not dealing with XML any more but java classes)
  4. There is the old SAX (not DOM) and StAX (a mixture of DOM and SAX)

Look up xpath and that would be really helpful.

Use "getElementsByTagName" function again on each node to get elements by tag name. Obviously...

Here's my sample code that goes few levels deep:

DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(acpFile);
        Element docEle = doc.getDocumentElement();
        NodeList series = docEle.getElementsByTagName("dod:recordSeries");

        if(series != null && series.getLength()>0) 
        {
            for(int i=0; i<series.getLength(); i++) 
            {
                Element serie = (Element)series.item(i);
                System.out.println("S -- "+serie.getAttribute("view:childName"));
                NodeList categories = serie.getElementsByTagName("dod:recordCategory");

                for(int j=0; j<categories.getLength(); j++)
                {
                    Element category = (Element)categories.item(j);
                    System.out.println("C ---- "+category.getAttribute("view:childName"));
                    NodeList recordFolders = category.getElementsByTagName("rma:recordFolder");

                    for(int k=0; k<recordFolders.getLength(); k++)
                    {
                        Element folder = (Element)recordFolders.item(k);
                        System.out.println("F ------ "+folder.getAttribute("view:childName"));
                    }
                }
            }
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM