2014-09-09 3 views
2

XML 파일을 언 마샬하기 위해 JAXB를 사용하고 있습니다.JAXB unmarshal mystery XML

내가 XML 파일에 대해 알고있는 건 그것이 유효한 XML이라는 것입니다.

그렇다면 어떻게 newInstance에 클래스 및/또는 패키지를 지정해야합니까?

JAXBContext jaxbContext = JAXBContext.newInstance(??????); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
Object o = (Object) unmarshaller.unmarshal(myFile); 

이 문제점을 해결 한 docs에는 아무것도 표시되지 않았습니다.

+0

하지만 너무 자주 자주하는 점은 다음과 같습니다. 왜 마샬링을 해제해야합니까? 어떤 데이터가 포함되어 있는지 모를 경우 : 사소한 방법으로 어떻게 처리 할 것을 제안합니까? - 일반적인 DOM 트리로 언 마샬링하는 경우에도 트리 크라이밍 이외에 무엇을 허용 할 것인지에 대한 아이디어가 필요합니다. – laune

답변

4

XML의 계층 구조를 해결하기 위해 클래스의 주석을 사용할 수 있도록 언 마샬링 할 클래스를 JaxB에 지정해야합니다. @XmlRootElement와 같은 주석이 붙은 클래스가 필요할 것입니다. 임의의 XML을 파싱하려면 DocumentBuilder 또는 xpath를 사용하여 무언가를 수행해야합니다.

자세한 내용은이 artical을 참조하십시오.

http://blog.bdoughan.com/2012/11/creating-generic-list-wrapper-in-jaxb.html

내가 클래스에 임의의 XML 변환 같은 것을 사용했다. any 필드는 실제로 정보를 얻을 수있는 org.w3c.dom.Element의 목록입니다.

http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Element.html

@XmlRootElement 
class Wrapper { 
     /** 
     * Everything else 
     */ 
     @Transient 
     @XmlAnyElement(lax = true) 
     private List<Element> any; 


     public List<Element> getAny() { 
      return any; 
     } 

} 
+0

그렇다면 내 경우 JAXB를 사용하지 않는 것이 유일한 대안입니까? – Josh

+0

jaxb serialization을 사용하면 소스와 대상이 무엇인지 알 필요가 있습니다. 임의의 xml 데이터를 unserialize하는 데 사용한 적이 있지만 사용할 수있는 개체를 제공하지는 않습니다 솔루션입니다. @ xmlAnyElement (lax = true)를 사용하면 모든 유형의 xml을 가져올 수 있으며 구문 분석 할 수있는 .dom.Element의 목록으로 변환하지만 이는별로 구매하지 않습니다. @XmlAnyElement 유형의 필드가있는 클래스가 있어야하며이 클래스를 newInstance의 인수로 사용합니다. –

0

는 newInstance와 당신은 .. 여기 예제

아래 ...

public static void main(String[] args) throws JAXBException { 
     final JAXBContext context = JAXBContext.newInstance(Vehicals.class); 
     final Marshaller m = context.createMarshaller(); 
     m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     final Vehicals vehicals = new Vehicals(); 

     List<Car> cars = new ArrayList<Car>(); 
     Car c = new Car(); 
     c.setName("Mercedes"); 
     cars.add(c); 

     c = new Car(); 
     c.setName("BMW"); 
     cars.add(c); 

     vehicals.setCar(cars); 

     m.marshal(vehicals, System.out); 
    } 

Vehicals를 예를 당신의 XML 매핑 클래스의 루트 요소를 추가해야합니다. java

import java.util.List; 

import javax.xml.bind.annotation.XmlRootElement; 

    @XmlRootElement 
    public class Vehicals { 

     private List<Car> Car; 

     public List<Car> getCar() { 
      return Car; 
     } 

     public void setCar(List<Car> cars) { 
      this.Car = cars; 
     } 
    } 

Car.java

import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlTransient; 

@XmlRootElement 
public class Car { 

    @XmlTransient 
    private Long id; 

    private String name; 

    @XmlTransient 
    private String code; 


    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getCode() { 
     return code; 
    } 
    public void setCode(String code) { 
     this.code = code; 
    } 
} 

비 정렬 화에 대한 output.xml

<Vehicle> 
    <Car> 
     <name>Mercedes</name> 
     </Car> 
    <Car> 
     <name>BMW</name> 
    </Car> 
</Vehicle> 

같은 일이다. 내 경우에는 newInstance 메서드에서 매개 변수로 Vehicals를 추가했습니다.

+0

답변 주셔서 감사합니다. 그러나 이것이 어떻게 도움이되는지 확인하지 못합니까? 당신은 여전히 ​​newInstance에 Vehicals.class를 전달하고 있습니다. – Josh