bunnyjesse112
bunnyjesse112

Reputation: 747

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">[email protected]</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="Рї">[email protected]</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="Рї">[email protected]</Econtact>
                        <Address street="" settlement="" postcode="" postbox="" flat="" district="" region="" country="" nontypical="" house=""/>
                    </Organization>
                </DocNumber>
                <Organization fullname="" shortname="РљРњРЈ" ownership="" ogrn="96325878" inn="">
                    <Econtact type="String">[email protected]</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="Рї">[email protected]</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.

Upvotes: 1

Views: 13392

Answers (2)

勿绮语
勿绮语

Reputation: 9320

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.

Upvotes: 3

Matjaz Muhic
Matjaz Muhic

Reputation: 5578

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"));
                    }
                }
            }
        }

Upvotes: 2

Related Questions