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
Author by
thilo
Updated on June 16, 2022Comments
-
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 over 11 yearsThank 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.