-1

我想知道是否有人可以帮忙,我有以下 xml 文件,问题是我看不到第三个节点“食物”。我使用 JAXB 创建了文件,其中创建了四个文件 ObjectFactory、Breakfast-menu、foodType 和 food。我可以从早餐菜单进入 foodType 并看到名称(新鲜和冷冻),但不是“食物”,它是内容。可以请给一些想法。谢谢

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

              }
4

1 回答 1

1

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

早餐菜单

JAXB (JSR-222)是异常配置,因此您只需在希望绑定不同于默认值的地方添加注释(请参阅: http ://blog.bdoughan.com/2012/07/jaxb-no-annotations-必需的.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);
    }

}
于 2013-02-08T01:49:36.710 回答