如何通过 JAXB xml 解析获取特定元素?
Posted
技术标签:
【中文标题】如何通过 JAXB xml 解析获取特定元素?【英文标题】:How to get a particular element through JAXB xml parsing? 【发布时间】:2012-12-30 19:02:10 【问题描述】:我已经使用 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>
我已经完成了这样的解组,它工作正常。为了性能,我不希望元素作为节点。还有其他方法吗?
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;
【问题讨论】:
您没有在代码 sn-p 的任何地方使用 jaxbMarshaller。 我只是在解组时进行处理 是的,有没有其他不使用node的方法? 你的对象模型是什么样的? 我不确定我是否完全理解您的问题,但您可能正在寻找类似:blog.bdoughan.com/2012/08/… 【参考方案1】:可以使用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();
更多信息
http://blog.bdoughan.com/2012/08/handle-middle-of-xml-document-with-jaxb.html【讨论】:
【参考方案2】:您必须执行以下代码才能执行JAXB Unmarshalling:
unmarshaler.unmarshal(source);
这将返回您使用 xjc 命令生成的类的实例。
然后您可以使用 bean 方法访问任何属性。
【讨论】:
谢谢,我确实喜欢这个 Header header =(Header) jaxbUnmarshaller.unmarshal(file)。但我只获取对象列表。如果我想获取子元素(即“From” )我需要这样做 Header.From.getCredential()...我不想要那个。我需要直接访问“From”元素,而不是从 Header。请让我清除。以上是关于如何通过 JAXB xml 解析获取特定元素?的主要内容,如果未能解决你的问题,请参考以下文章
XSD 到 jaxb 注释类给出了无法解析 xml 元素错误