unexpected element (uri:"", local:"Group"). Expected elements are <{}group>
Xmlから非整列化するときに例外を満たします
JAXBContext jc = JAXBContext.newInstance(Group.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Group group = (User)unmarshaller.unmarshal(new File("group.xml"));
グループクラスには注釈がなく、group.xmlにはデータのみが含まれます。
原因は何かありますか?
XMLドキュメントには、「グループ」ではなく「グループ」というルート要素があるようです。あなたはできる:
生成されたjaxbパッケージにpackage-info.Javaを配置する必要があります。その内容はそのようなものでなければなりません
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/StudentOperations/")
package generated.marsh;
幸いなことに、package-infoクラスは必要ありません。私はiowatiger08ソリューションで私の問題を修正することができました。
ここに、いくつかのドットを結合するのに役立つエラーメッセージを表示する修正を示します。
エラーメッセージ
javax.xml.bind.UnmarshalException:予期しない要素(uri: " http://global.aon.bz/schema/cbs/archive/errorresource/ "、local: "errorresource")。予想される要素は<{} errorresource>です
修正前のコード
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="", propOrder={"error"})
@XmlRootElement(name="errorresource")
public class Errorresource
修正後のコード
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="", propOrder={"error"})
@XmlRootElement(name="errorresource", namespace="http://global.aon.bz/schema/cbs/archive/errorresource/0")
public class Errorresource
エラーメッセージに示されているように、@ XmlRootElementに追加されたネームスペースを確認できます。
さらに調べた後、Blaiseが注目しているように、ルート要素をスキーマ名前空間に関連付ける必要があります。それでも、私はpackage-info Javaを持っていませんでした。したがって、@ XMLSchemaアノテーションを使用せずに、この問題を修正することができました。
@XmlRootElement (name="RetrieveMultipleSetsResponse", namespace = XMLCodeTable.NS1)
@XmlType(name = "ns0", namespace = XMLCodeTable.NS1)
@XmlAccessorType(XmlAccessType.NONE)
public class RetrieveMultipleSetsResponse {//...}
お役に立てれば!
これはかなりニッチなユースケースの修正ですが、毎回私を取得します。 Eclipse Jaxbジェネレーターを使用している場合、package-infoというファイルが作成されます。
@javax.xml.bind.annotation.XmlSchema(namespace = "blah.xxx.com/em/feed/v2/CommonFeed")
package xxx.blah.mh.domain.pl3xx.startstop;
このファイルを削除すると、より一般的なxmlを解析できます。試してみる!
私は同じ問題を抱えていました。それは助けになりました。XMLファイルのタグ名と同じクラスのフィールド名を指定しています(ファイルは外部システムから取得されます)。
例えば:
私のxmlファイル:
<Response>
<ESList>
<Item>
<ID>1</ID>
<Name>Some name 1</Name>
<Code>Some code</Code>
<Url>Some Url</Url>
<RegionList>
<Item>
<ID>2</ID>
<Name>Some name 2</Name>
</Item>
</RegionList>
</Item>
</ESList>
</Response>
私の応答クラス:
@XmlRootElement(name="Response")
@XmlAccessorType(XmlAccessType.FIELD)
public class Response {
@XmlElement
private ESList[] ESList = new ESList[1]; // as the tag name in the xml file..
// getter and setter here
}
私のESListクラス:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="ESList")
public class ESList {
@XmlElement
private Item[] Item = new Item[1]; // as the tag name in the xml file..
// getters and setters here
}
私のアイテムクラス:
@XmlRootElement(name="Item")
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {
@XmlElement
private String ID; // as the tag name in the xml file..
@XmlElement
private String Name; // and so on...
@XmlElement
private String Code;
@XmlElement
private String Url;
@XmlElement
private RegionList[] RegionList = new RegionList[1];
// getters and setters here
}
私のRegionListクラス:
@XmlRootElement(name="RegionList")
@XmlAccessorType(XmlAccessType.FIELD)
public class RegionList {
Item[] Item = new Item[1];
// getters and setters here
}
私のDemoUnmarshallingクラス:
public class DemoUnmarshalling {
public static void main(String[] args) {
try {
File file = new File("...");
JAXBContext jaxbContext = JAXBContext.newInstance(Response.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
jaxbUnmarshaller.setEventHandler(
new ValidationEventHandler() {
public boolean handleEvent(ValidationEvent event ) {
throw new RuntimeException(event.getMessage(),
event.getLinkedException());
}
}
);
Response response = (Response) jaxbUnmarshaller.unmarshal(file);
ESList[] esList = response.getESList();
Item[] item = esList[0].getItem();
RegionList[] regionLists = item[0].getRegionList();
Item[] regionListItem = regionLists[0].getItem();
System.out.println(item[0].getID());
System.out.println(item[0].getName());
System.out.println(item[0].getCode());
System.out.println(item[0].getUrl());
System.out.println(regionListItem[0].getID());
System.out.println(regionListItem[0].getName());
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
それは与えます:
1
Some name 1
Some code
Some Url
2
Some name 2
同じ問題がありました。 <xs:schema..>
に次の属性を追加しましたelementFormDefault = "qualified" attributeFormDefault = "unqualified"
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.example.com/schemas/ArrayOfMarketWithStations"
targetNamespace="http://www.example.com/schemas/ArrayOfMarketWithStations"
elementFormDefault="qualified" attributeFormDefault="unqualified" >
xjcを実行してJavaクラスを再生成し、package-info.Javaを修正しました。
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.com/schemas/ArrayOfMarketWithStations", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
これで問題が解決しました。
私と同じ。マッピングクラスの名前はMbean
でしたが、タグのルート名はmbean
であったため、注釈を追加する必要がありました。
@XmlRootElement(name="mbean")
public class MBean { ... }
package-info.Java
クラスをcontextPathのパッケージに配置し、同じクラスのコードの下に配置する必要があります。
@javax.xml.bind.annotation.XmlSchema(namespace = "https://www.namespaceUrl.com/xml/", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.test.valueobject;