如何通过JAXB xml解析获取特定元素?
问题描述:
我已经使用JAXB来解析XML。如何通过JAXB xml解析来获取特定元素(即子节点),而无需将该元素解析为节点。如何通过JAXB xml解析获取特定元素?
<?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>
我做解组这样的,它的工作原理fine.For的表现,我不想要的元素node.Is有任何其它的办法吗?
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);
对象模型就像
@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;
}
}
答
A StAX (JSR-173)解析器(包含在以Java SE 6开头的JDK/JRE中)可以使用。然后,您可以将XMLStreamReader
提前到子节点并从那里解组。
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();
}
}
对于
答
你将不得不做这样做JAXB Unmarshalling下面的代码:
unmarshaler.unmarshal(source);
这将返回的实例你会拥有的课程使用xjc命令生成。
然后,您可以使用bean方法访问任何属性。
+0
谢谢你,我已经这样做了Header header =(Header)jaxbUnmarshaller.unmarshal(file)。但是我得到的只是对象列表。如果我想获取子元素(即“From”),我需要这样做Header.From.getCredential()...我不想那个。我需要直接访问“From”元素,而不是从Header.Please让我清除。 – thilo
你是不是在您的代码段使用jaxbMarshaller任何地方更多的信息。 –
我正在解组只有 – thilo
是的,有没有其他的方式做不使用节点? – thilo