如何通过JAXB XML解析获取特定元素?

7

我使用了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;
    }

}


你的代码片段中没有使用 jaxbMarshaller。 - Narendra Pathai
我只是在谈论反序列化时。 - thilo
有没有其他方法可以不使用 Node 来完成? - thilo
你的对象模型是什么样子的? - bdoughan
1
我不确定我完全理解你的问题,但你可能正在寻找类似这样的东西:http://blog.bdoughan.com/2012/08/handle-middle-of-xml-document-with-jaxb.html - bdoughan
显示剩余2条评论
2个回答

7

可以使用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();
    }

}

更多信息


0

你将需要执行以下代码来进行 JAXB 反编组

unmarshaler.unmarshal(source);

这将返回您使用xjc命令生成的类的实例

然后,您可以使用bean方法访问任何属性。


谢谢,我已经这样做了 Header header =(Header)jaxbUnmarshaller.unmarshal(file)。但是我只得到对象列表。如果我想获取子元素(即“From”),我需要这样做 Header.From.getCredential()... 我不想要那个。我需要直接访问“From”元素,而不是从Header中访问。请帮我澄清一下。 - thilo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接