在JAXB中看不到节点

时间:2013-02-07 12:30:12

标签: xml jaxb unmarshalling

我想知道是否有人可以提供帮助,我有以下xml文件,问题是我看不到第三个节点'食物'。我用JAXB创建了文件,有四个文件已经创建了ObjectFactory,Breakfast-menu,foodType和food。我可以从早餐菜单中找到食物类型,看到名称(新鲜和冷冻),但不是'食物',它的内容。可以请一些想法。 感谢

<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>

Java

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

              }

1 个答案:

答案 0 :(得分:1)

由于这个用例有一个非常简单的XML文档,我建议从Java对象开始。

<强> BreakfastMenu

JAXB (JSR-222)是异常配置,因此您只需要在希望绑定与默认值不同的地方添加注释(请参阅:http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html)。

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

}

<强>食物类型

默认情况下,映射基于公共属性,但我们可以更改JAXB以使用带有@XmlAccessorType(XmlAccessType.FIELD)注释的字段(请参阅: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);
    }

}