How to get a particular element through JAXB xml parsing?

15,973

A StAX (JSR-173) parser (included in the JDK/JRE starting with Java SE 6) can be used. Then you can advance the XMLStreamReader to the child node and unmarshal from there.

import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory xif = XMLInputFactory.newFactory();
        StreamSource xml = new StreamSource("src/forum14358769/input.xml");
        XMLStreamReader xsr = xif.createXMLStreamReader(xml);

        // Advance to the "To" element.
        while(xsr.hasNext()) {
            if(xsr.isStartElement() && "To".equals(xsr.getLocalName())) {
                break;
            }
            xsr.next();
         }

        // Unmarshal from the XMLStreamReader that has been advanced
        JAXBContext jc = JAXBContext.newInstance(ToType.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        ToType toType = unmarshaller.unmarshal(xsr, ToType.class).getValue();
    }

}

For More Information

Share:
15,973
thilo
Author by

thilo

Updated on June 16, 2022

Comments

  • thilo
    thilo almost 2 years

    I have used JAXB to parse an XML.How to get a particular element(ie a child node) through JAXB xml parsing without parsing that element as node.

    <?xml version="1.0" encoding="UTF-8"?>
            <Header>
                <From>
                <Credential
                            domain="NetworkId"><Identity>ANXXXNNN</Identity>
                </Credential>
                </From>
    
                <To>
                <Credential
                            domain="NetworkId"><Identity>ANNNXXXXXT</Identity>
                </Credential>
                </To>
    
                <To>
                <Credential
                            domain="NetworkId"><Identity>BNNXXXT</Identity>
                </Credential>
                </To>
            </Header>
    

    I have done unmarshalling like this,It works fine.For performance,I dont want the elements as node.Is there anyother way to do?

    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc;
        doc = db.parse(file);
        NodeList node = (NodeList)doc.getElementsByTagName("TO");
    
       JAXBElement<ToType> element =  jaxbUnmarshaller.unmarshal(node.item(0),ToType.class);
    

    Object model is like

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "ToType", propOrder = {
        "credential"
    })
    public class ToType {
    
        @XmlElement(name = "Credential", required = true)
        protected CredentialType credential;
    
    
        public CredentialType getCredential() {
            return credential;
        }
    
        public void setCredential(CredentialType value) {
            this.credential = value;
        }
    

    }

  • thilo
    thilo over 11 years
    Thank you,I have did like this Header header =(Header) jaxbUnmarshaller.unmarshal(file).But I am getting list of objects only.If I want to get child element (ie "From")I need to do like this Header.From.getCredential()...I dont want that.I need to directly access "From" element,not from Header.Please make me to clear.