2014-12-13 129 views
3

我想使用JAXB解析xml文件。 我的問題是,我需要跳過根節點,如果我從xml文件中刪除它,我得到我所需要的,否則 - 我得到一個空的對象。忽略JAXB中的根元素

我給一個簡單的XML和我的代碼(它的工作方式):

XML:

<?xml version="1.0" encoding="utf-8"?> 
<Root> 
<!-- <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="Office.xsd"> 
--> 
    <Office> 
     <Employees> 
      <Employee> 
       <name>George</name> 
       <rank>3</rank> 
      </Employee> 
      <Employee> 
       <name>Michael</name> 
       <rank>5</rank> 
      </Employee> 
      <Employee> 
       <name>Jeff</name> 
       <rank>1</rank> 
      </Employee> 
      <Employee> 
       <name>Todd</name> 
       <rank>7</rank> 
      </Employee> 
      <Employee> 
       <name>Jessica</name> 
       <rank>5</rank> 
      </Employee> 
     </Employees> 
    </Office> 
</Root> 

辦公類:

import javax.xml.bind.annotation.*; 
import java.util.Vector; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Office { 

    @XmlElementWrapper(name = "Employees") 
    @XmlElement(name = "Employee") 
    private Vector<Employee> employees; 

} 

Employee類:

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAccessType; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Employee { 

    @XmlElement(name="name") 
    private String name; 
    @XmlElement(name="rank") 
    private int rank; 


    public void promote() { 
     rank++; 
    } 

} 

Driv呃:

import javax.xml.stream.*; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.Marshaller; 

import java.io.FileReader; 
public class Driver { 

    public static void main (String[] args) { 
     parseOffice(); 

    } 

    public static void parseOffice() { 
     try { 

      XMLInputFactory f = XMLInputFactory.newInstance(); 
      XMLStreamReader reader = f.createXMLStreamReader(new FileReader("Office.xml")); 

      JAXBContext context = JAXBContext.newInstance(Office.class); 
      Unmarshaller unmarshaller = context.createUnmarshaller(); 
      Office office = unmarshaller.unmarshal(reader, Office.class).getValue(); 

      Marshaller marshaller = context.createMarshaller(); 
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
      marshaller.marshal(office, System.out); 

     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     } 
} 
+0

我忽略輸出,因爲後是足夠長的時間,它可以很容易被複制;但是,如果我需要包括它,我會這樣做。 – Michael 2014-12-13 18:54:10

回答

3

你爲什麼不創建一個通用的根元素?

@XmlRootElement(name="Root" ...) 
public class Root { 
    @XmlAnyElement(lax=true) 
    private Object content; 
} 

將它添加到您的上下文和解組。你應該得到一個JAXBElement<Office>作爲content

+1

好吧,顯然我可以這樣做 - 但那不是我想要的原因:如果可能,我想知道如何在不添加任何東西的情況下執行此操作。我需要一種方法來忽略或跳過根元素。我想,我應該在我的問題中提到它。 +1 – Michael 2014-12-13 19:15:16

+2

@Michael你必須在任何情況下添加一些東西。要麼是額外的根元素映射,要麼是較低級別的跳過代碼。我會說一個額外的根類更好,因爲它與其他映射相同,並與任何東西(SAX,StAX,DOM)一起工作。但是,您可能有技術上的原因(目前對我來說不透明),否則就想擁有它。然後在較低級別上執行 - 跳過StAX狀態,過濾SAX事件,在DOM中進行預先潛水。 – lexicore 2014-12-13 19:40:36

+0

出於好奇,我如何將'content'對象轉換爲office對象?我可以這樣做,因爲Panther建議,但有一種簡單的方法可以用更通用的方式進行轉換嗎? – Joseph 2016-01-21 18:55:35

1

只需添加層級的根類即可。並從Root類獲取Office類。

根類: -

import javax.xml.bind.annotation.*; 
import java.util.Vector; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Root { 


@XmlElement(name = "Office") 
private Office office; 
} 

辦公室類

import javax.xml.bind.annotation.*; 
import java.util.Vector; 


    @XmlAccessorType(XmlAccessType.FIELD) 
    public class Office { 

    @XmlElementWrapper(name = "Employees") 
    @XmlElement(name = "Employee") 
    private Vector<Employee> employees; 

    } 

變化解析方法: -

 JAXBContext context = JAXBContext.newInstance(Root.class); 
     Unmarshaller unmarshaller = context.createUnmarshaller(); 
     Root root = unmarshaller.unmarshal(reader, Root.class).getValue(); 
     Office office = root.getOffice(); 
+0

您將內容限制在「Root」中的'Office',這是不靈活的。 – lexicore 2014-12-13 19:36:29

+0

@lexicore感謝您的輸入,我只是想解決他的問題。由於他似乎不想做太多的改變 – Panther 2014-12-13 19:38:24

+0

沒問題,只是一個提示。如果你是對的,我們的兩條魚都似乎不適合OP。有時候是這樣的。 – lexicore 2014-12-13 19:42:04