2013-02-07 5 views
-1

누군가 도울 수 있다면 다음 xml 파일이 있는데, 문제는 제 3 노드 '음식'을 볼 수 없다는 것입니다. JAXB를 사용하여 파일을 만들었습니다. 네 개의 파일이 ObjectFactory, Breakfast-menu, foodType 및 food로 만들어졌습니다. 나는 아침 식사 메뉴에서 foodType에 도착할 수 있고 이름 (신선하고 얼어 붙은)을 볼 수는 있지만 '음식'과 그 내용은 볼 수 없다. 어떤 아이디어를 좀주세요. 감사JAXB에서 노드를 볼 수 없습니다

<Breakfast-menu> 
    <foodType> 
     <name>fresh</name> 
     <food name="Milk"> 
      <price>2</price> 
     </food> 
     <food name="Pears"> 
      <price>3</price> 
     </food> 
     <food name="Apples"> 
      <price>1</price> 
     </food> 
    </foodType> 
    <foodType> 
     <name>frozen</name> 
     <food name="Fish"> 
      <price>2</price> 
     </food> 
     <food name="chips"> 
      <price>1</price> 
     </food> 
    </foodType> 
</Breakfast-menu> 

자바

JAXBContext jaxbContext = JAXBContext.newInstance("food"); 
       Unmarshaller u = jaxbContext.createUnmarshaller(); 

       BreakfastMenu bM = (BreakfastMenu) u.unmarshal( 
         new FileInputStream("C:\\Users\\food.xml")); 
       List<FoodType> tType = bM.getFoodType();     
       for (FoodType tT : tType) { 
       System.out.println("\t" + tT.getFood()); 

       } 
+0

무엇 JAXB 모델처럼 당신이 생성하는 데 사용되는 XML 스키마 보는가? 생성 된 모델에서'JAXBContext'를 어떻게 작성하고 있습니까? 이것은 간단한 XML 문서이므로 Java 객체에서 시작한다고 생각해 보았습니까? –

+0

답장을 보내 주셔서 감사합니다. 위의 내용을 분명히하지 않았으므로 '음식'노드는 볼 수 있지만 자녀는 아닙니다 (가격). – Zed420

+0

'food' 요소에 매핑되는 클래스는 어떻게 생겼습니까? –

답변

1

이 사용 사례가 나는 자바 객체에서 시작하는 것이 좋습니다 매우 간단한 XML 문서를 가지고 있기 때문에. 만 (: http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html 참조)이 기본 다를 바인딩 원하는 주석을 추가 할 필요가 있으므로

BreakfastMenu

JAXB (JSR-222)는 예외로 구성입니다.

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

@XmlRootElement(name="Breakfast-menu") 
public class BreakfastMenu { 

    private List<FoodType> foodType; 

    public List<FoodType> getFoodType() { 
     return foodType; 
    } 

    public void setFoodType(List<FoodType> foodType) { 
     this.foodType = foodType; 
    } 

} 

FoodType

는 기본적으로 매핑이 대중 속성을 기반으로하고 있지만 우리는 @XmlAccessorType(XmlAccessType.FIELD) 주석과 필드를 사용 JAXB를 변경할 수 있습니다 (참조 : http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html을).

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

@XmlAccessorType(XmlAccessType.FIELD) 
public class FoodType { 

    private String name; 

    @XmlElement(name="food") 
    private List<Food> foods; 

} 

식품

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Food { 

    @XmlAttribute 
    private String name; 

    private int price; 

} 

데모

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(BreakfastMenu.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum14751166/input.xml"); 
     BreakfastMenu bm = (BreakfastMenu) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(bm, System.out); 
    } 

} 
+1

Blaise, 정말 큰 도움을 주셔서 감사합니다. 나는 그걸 작동시킬 수 있었다. – Zed420

관련 문제