-1

誰か助けてくれるかしら、次のxmlファイルがあります。問題は、3番目のノード「food」が表示されないことです。JAXBを使用してファイルを作成しました。ObjectFactory、Breakfast-menu、foodType、およびfoodの4つのファイルが作成されました。朝食メニューから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>

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

              }
4

1 に答える 1

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

}

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

}
于 2013-02-08T01:49:36.710 に答える