- - PR -
JAXB2.0での複数要素をもつタグのアンマーシャルについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-12-23 05:21
はじめて利用させていただきます。
よろしくお願いいたします。 以下のサイトを見ながら、JAXB2.0のデータバインディングを学習中ですが、 サンプル記載のとおり行っても、XMLファイルの内容の出力ができません。 http://itpro.nikkeibp.co.jp/article/COLUMN/20080530/305406/?ST=develop 3ページ目の複数要素として持つ別のタグをXMLshemaに定義した場合にのみ、 コンソールに何も出力されずに終了します。 (別の単純なタグを持つ場合は、上手く処理できています) @XML schemaを用いて、スキーマファイルを作成。 Axjcコマンドで、JAXBオブジェクトを作成。 B、アンマーシャルを行う処理(UnmarshallerSample)を実施 UnmarshallerSampleクラス内で、アンマーシャル後にリストで要素を獲得して いますが、この獲得方法に誤りがあるのではと思っています…が、分かりません;w; 分かる方がいらっしゃいましたら、ご教授していただけないでしょうか。 OS :WindowsXP Java:JavaEE5(JAXB2.0同梱) ------------------------------- ■XML schema定義 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="persons"> <xs:complexType> <xs:sequence> <xs:element ref="person" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="person"> <xs:complexType> <xs:attribute name="name" type="xs:string"/> <xs:attribute name="age" type="xs:int"/> <xs:attribute name="sex" type="sex"/> </xs:complexType> </xs:element> <xs:simpleType name="sex"> <xs:restriction base="xs:string"> <xs:enumeration value="MALE"/> <xs:enumeration value="FEMALE"/> </xs:restriction> </xs:simpleType> </xs:schema> ■artists.xml(このファイルをアンマーシャルし、内容をコンソール出力する) <?xml version="1.0" encoding="Shift-jis" standalone="yes"?> <persons> <parson name="aaa" age="12" sex="MAIL" /> <parson name="abc" age="15" sex="MAIL" /> </persons> ■UnmarshallerSample.java(xmlファイルを読み込みアンマーシャルを実行するクラス) 名前空間や、catch文の実装など、サンプルとは少し変えています。 import java.io.File; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import generated.Persons; import generated.Person; public class UnmarshallerSample { public UnmarshallerSample() { try { // 1. JAXBContextオブジェクトの生成 // 引数はパッケージもしくはクラス JAXBContext context = JAXBContext.newInstance("generated"); // 2. Unmarsallerオブジェクトの取得 Unmarshaller unmarshaller = context.createUnmarshaller(); File file = new File("artists.xml"); // 3. アンマーシャリング // 戻り値はルートタグに相当するクラス Object obj = unmarshaller.unmarshal(file); Persons artists = (Persons)obj; // 4. 変換されたオブジェクトにアクセス java.util.List<Person> p = artists.getPerson(); for (Person person: artists.getPerson()) { System.out.printf("%s\\\\tAge: %2d Sex: %s%n", person.getName(), person.getAge(), person.getSex()); } } catch (JAXBException ex) { System.out.println(ex); // 例外処理 } } public static void main(String[] args) { new UnmarshallerSample(); } } ■Persons.java xjcコマンドで自動生成されるソース。 persons要素は複数のperson要素をもつ。 // // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> // Any modifications to this file will be lost upon recompilation of the source schema. // Generated on: 2008.12.23 at 03:15:40 午前 JST // package generated; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; /** * <p>Java class for anonymous complex type. * * <p>The following schema fragment specifies the expected content contained within this class. * * <pre> * <complexType> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * <element ref="{}person" maxOccurs="unbounded" minOccurs="0"/> * </sequence> * </restriction> * </complexContent> * </complexType> * </pre> * * */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "person" }) @XmlRootElement(name = "persons") public class Persons { protected List<Person> person; /** * Gets the value of the person property. * * <p> * This accessor method returns a reference to the live list, * not a snapshot. Therefore any modification you make to the * returned list will be present inside the JAXB object. * This is why there is not a <CODE>set</CODE> method for the person property. * * <p> * For example, to add a new item, do as follows: * <pre> * getPerson().add(newItem); * </pre> * * * <p> * Objects of the following type(s) are allowed in the list * {@link Person } * * */ public List<Person> getPerson() { if (person == null) { person = new ArrayList<Person>(); } return this.person; } } ■Person.java xjcコマンドで自動生成されるソース。 // // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> // Any modifications to this file will be lost upon recompilation of the source schema. // Generated on: 2008.12.23 at 03:15:40 午前 JST // package generated; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; /** * <p>Java class for anonymous complex type. * * <p>The following schema fragment specifies the expected content contained within this class. * * <pre> * <complexType> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * <element ref="{}person" maxOccurs="unbounded" minOccurs="0"/> * </sequence> * </restriction> * </complexContent> * </complexType> * </pre> * * */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "person" }) @XmlRootElement(name = "persons") public class Persons { protected List<Person> person; /** * Gets the value of the person property. * * <p> * This accessor method returns a reference to the live list, * not a snapshot. Therefore any modification you make to the * returned list will be present inside the JAXB object. * This is why there is not a <CODE>set</CODE> method for the person property. * * <p> * For example, to add a new item, do as follows: * <pre> * getPerson().add(newItem); * </pre> * * * <p> * Objects of the following type(s) are allowed in the list * {@link Person } * * */ public List<Person> getPerson() { if (person == null) { person = new ArrayList<Person>(); } return this.person; } } ----- そのほか、 ObjectFactory.java Sex.java もxjcコマンドで自動生成されますが、今回の事象と関係ないと思われるため、 割愛します。 ■実行結果 C:\\\\jaxb>javac UnmarshallerSample.java C:\\\\jaxb>java UnmarshallerSample ★何も出力されない C:\\\\jaxb> |
|
投稿日時: 2008-12-23 09:13
XMLがSchemaにあってないので、修正してみてください。
(3, 42) cvc-complex-type.2.4.a: Invalid content was found starting with element 'parson'. One of '{person}' is expected. |
|
投稿日時: 2008-12-23 17:34
だっちょさん、返答ありがとうございます。
XMLファイルを見直してみると…確かにおかしな箇所がありました。 parsonではなく、personでした^^; しかもMALEもMAILになってるし…orz 簡単なミスでお恥ずかしいです。 修正し、再実行したところ正常に表示されました。 ありがとうございました。 |
1