2013-01-16 55 views
7

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

}

+0

你是不是在您的代码段使用jaxbMarshaller任何地方更多的信息。 –

+0

我正在解组只有 – thilo

+0

是的,有没有其他的方式做不使用节点? – thilo

回答

7

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(); 
    } 

} 

对于

0

你将不得不做这样做JAXB Unmarshalling下面的代码:

unmarshaler.unmarshal(source); 

这将返回的实例你会拥有的课程使用xjc命令生成。

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

+0

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