web-dev-qa-db-ja.com

JAXBでこのXMLをJavaで解析するにはどうすればよいですか?

次のXMLがあり、XSDもスキーマもありません。JAXAを使用してJavaオブジェクト)に解析したいので、SAXよりも優れていると聞きました。これを実現する方法はありますかアノテーションまたはこれを行うためのより良い方法ですか?それは、単一のFosterHomeクラスだけが必要になるように作られていますか?これを行う方法を見つけるのに苦労しています。

私はもともとFosterHome、Family、Childのクラスを持つことを考えていました。 JAXBを使用して、3つのクラスが不要になりましたか? ChildIDが2つの異なる領域に表示されるため、これに対処する方法がわかりません。

<?xml version="1.0" encoding="UTF-8"?>
<FosterHome>
    <Orphanage>Happy Days Daycare</Orphanage>
    <Location>Apple Street</Location>
    <Families>
        <Family>
            <ParentID>Adams</ParentID>
            <ChildList>
                <ChildID>Child1</ChildID>
                <ChildID>Child2</ChildID>
            </ChildList>
        </Family>
        <Family>
            <ParentID>Adams</ParentID>
            <ChildList>
                <ChildID>Child3</ChildID>
                <ChildID>Child4</ChildID>
            </ChildList>
        </Family>
    </Families>
    <RemainingChildList>
        <ChildID>Child5</ChildID>
        <ChildID>Child6</ChildID>
    </RemainingChildList>
</FosterHome>
37
Rolando

次のことができます。 @XmlElementWrapper必要なクラスの量を減らすことができます。

FosterHome

package nov18;

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

@XmlRootElement(name="FosterHome")
@XmlAccessorType(XmlAccessType.FIELD)
public class FosterHome {

    @XmlElement(name="Orphanage")
    private String orphanage;

    @XmlElement(name="Location")
    private String location;

    @XmlElementWrapper(name="Families")
    @XmlElement(name="Family")
    private List<Family> families;

    @XmlElementWrapper(name="RemainingChildList")
    @XmlElement(name="ChildID")
    private List<String> remainingChildren;

}

家族

package nov18;

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

@XmlAccessorType(XmlAccessType.FIELD)
public class Family {

    @XmlElement(name="ParentID")
    private String parentID;

    @XmlElementWrapper(name="ChildList")
    @XmlElement(name="ChildID")
    private List<String> childList;

}

デモ

package nov18;

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        FosterHome fosterHome = (FosterHome) unmarshaller.unmarshal(new File("src/nov18/input.xml"));

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

}

入力/出力

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FosterHome>
    <Orphanage>Happy Days Daycare</Orphanage>
    <Location>Apple Street</Location>
    <Families>
        <Family>
            <ParentID>Adams</ParentID>
            <ChildList>
                <ChildID>Child1</ChildID>
                <ChildID>Child2</ChildID>
            </ChildList>
        </Family>
        <Family>
            <ParentID>Adams</ParentID>
            <ChildList>
                <ChildID>Child3</ChildID>
                <ChildID>Child4</ChildID>
            </ChildList>
        </Family>
    </Families>
    <RemainingChildList>
        <ChildID>Child5</ChildID>
        <ChildID>Child6</ChildID>
    </RemainingChildList>
</FosterHome>

詳細情報


[〜#〜] update [〜#〜]

FamilyクラスのすべてのChildIDを反復/印刷できる簡単な方法はありますか?

次のことができます。

    for(Family family : fosterHome.getFamilies()) {
        System.out.println(family.getParentID());
        for(String childID : family.getChildList()) {
            System.out.println("    " + childID);
        }
    }
60
bdoughan
try {
    // create a JAXBContext capable of handling classes generated into
    // the com.abhi.xml.jaxb.generated package
    JAXBContext jc = JAXBContext.newInstance( "com.abhi.xml.jaxb.generated" );

    // create an Unmarshaller
    Unmarshaller u = jc.createUnmarshaller();

    // unmarshal a FosterHome instance document into a tree of Java content
    // objects composed of classes from the com.abhi.xml.jaxb.generated 
    // package.
    JAXBElement<?> fhElement =(JAXBElement<?>)u.unmarshal
    (new FileInputStream("yourfile.xml"));
    FosterHome FH = (FosterHome)fhElement.getValue();
    System.out.println(FH.getDesc());
         // so on ..you can get all elements based on generated objects

} catch( JAXBException je ) {
    je.printStackTrace();
} catch( IOException ioe ) {
    ioe.printStackTrace();
}
3
Abhishek

これはこれを行うための良いチュートリアルのようです

http://blog.espenberntsen.net/2010/02/26/generate-jaxb-classes-from-an-xsd-schema-and-the-schema-from-an-xml-sample-document/

Xmlファイルからxsdスキーマを生成する方法と、そのスキーマを使用してjaxbクラスを生成する方法について詳しく説明します。最終的には、複数のクラスになります。

1
Danny