javax.xml.bind.UnmarshalException:予期しない要素(uri:“”、local:“ Group”)


103
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にはデータのみが含まれます。

原因は何ですか?


4
検索からここに来た人のために、私はこれがObjectFactory、2つの異なる生成されたソースディレクトリを混合している場合に発生する可能性が高い、誤った生成元のソースを使用することによって引き起こされる可能性があることをコメントしたいと思います。
bbarker

回答:


119

XMLドキュメントに「group」ではなく「Group」というルート要素があるようです。あなたはできる:

  1. XMLのルート要素を「グループ」に変更します
  2. アノテーション@XmlRootElement(name = "Group")をGroupクラスに追加します。

2
問題は解決しました。ありがとうございます。2番目のソリューションである@XmlRootElement(name = "Group")を使用しました。私のクラス名はGroupで、XMLルート要素はGroupですが、なぜname = "Group"が必要なのですか
user496949


2
@BlaiseDoughan私はまったく反対の問題を抱えて@XmlRootElement(name = "MB") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "MB", propOrder = { "date", "time" })います、私は持っていunexpected element (uri:"http://xx.title.com/new/response", local:"MB"). Expected elements are <{}Date>,<{}MB>,<{}Time>ますが@XmlElement(name="Date", required = true)、各フィールドについても持っています。どこで、なぜ間違っているのですか?私も削除してみました@XmlRootElement
Rahul Thakur

4
で問題が発生し@XmlSchemaましたがpackage-info.java、現在修正されています。
Rahul Thakur

35

生成されたjaxbパッケージにpackage-info.javaを配置する必要があります。その内容はそのようなものでなければなりません

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/StudentOperations/")
package generated.marsh;

33

幸い、package-infoクラスは必要ありません。私はiowatiger08ソリューションで私の問題を修正することができました。

これは、いくつかのドットを結合するのに役立つエラーメッセージを示す私の修正です。

エラーメッセージ

javax.xml.bind.UnmarshalException:予期しない要素(uri: " http://global.aon.bz/schema/cbs/archive/errorresource/0"、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に追加された名前空間を確認できます。


同じ問題に直面し、あなたのコメントに従い、問題は解決されました。ありがとうございました。
Bibin Zacharias、

9

詳細を確認した後、Blaiseが指摘しているように、ルート要素をスキーマ名前空間に関連付ける必要があります。まだ、package-info javaを持っていませんでした。@XMLSchemaアノテーションを使用せずに、私はこの問題を修正することができました

@XmlRootElement (name="RetrieveMultipleSetsResponse", namespace = XMLCodeTable.NS1)
@XmlType(name = "ns0", namespace = XMLCodeTable.NS1)
@XmlAccessorType(XmlAccessType.NONE)
public class RetrieveMultipleSetsResponse {//...}

お役に立てれば!


ルート要素に名前空間を追加するのは大変です!:-)
Konstantin Ivanov

5

これはかなりニッチなユースケースの修正ですが、毎回私に教えてくれます。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を解析できるようになります。試してみる!


1
それはその後完璧に目を覚ました..おかげでたくさんの仲間.. :)。上記の名前空間を空の文字列にしました。
Arundev

2

同じ問題がありました。それは役に立ちました。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

1

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;

0

私も同じです。マッピングクラスのMbean名前はmbeanそうでしたが、タグのルート名はそうだったので、注釈を追加する必要がありました:

@XmlRootElement(name="mbean")
public class MBean { ... }

0

同じ問題がありました。elementFormDefault = "qualified"に次の属性を追加しました<xs:schema..> 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" >

そして、package-info.javaを修正したxjcを実行して、Javaクラスを再生成しました。

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.com/schemas/ArrayOfMarketWithStations", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)

これで問題が解決しました。


0

私はすでに同じ問題を抱えており、以下のように変更します:

@XmlRootElement -> @XmlRootElement(name="Group")

0

私は同じ問題を抱えていましたが、私の問題は、2つの異なるwsdl-filesを持つ2つの異なるWebサービスがあったことです。両方のWebサービスに対して同じパッケージでソースを生成しましたが、これは問題のようです。ObjectFactoryのせいか、おそらくpackage-info.javaのせいだと思います。これらは1回しか生成されないためです。

別のパッケージで各Webサービスのソースを生成することで解決しました。このようにして、2つの異なるObjectFactoriesおよびpackage-info.javaファイルも作成されます。


0

これがテストでのみ発生し、PowerMockを使用しているために狂っている場合は、これが解決策です。テストクラスの上に追加します。

@PowerMockIgnore({ "javax.xml.*", "org.xml.*", "org.w3c.*" })

0

ここで述べた解決策のどれも私にとってはうまくいきませんでした、私はまだ得ていました:

スレッド "main"の例外javax.xml.bind.UnmarshalException:予期しない要素(uri: "java:XXX.XX.XX.XXX"、local: "XXXXX")

以下の他のサイトを介した多くの研究の後、コードは私のために働きました-

FileInputStream fis = new FileInputStream("D:/group.xml");
SOAPMessage message = factory.createMessage(new MimeHeaders(), fis);
JAXBContext jc = JAXBContext.newInstance(Group.class);
Unmarshaller u = jc.createUnmarshaller();
JAXBElement<Group> r = u.unmarshal(message.getSOAPBody().extractContentAsDocument(), Group.class);
Group group = r.getValue();

-1

上記のいずれも機能しない場合は、追加してみてください

@XmlRootElement(name="Group") グループクラスに。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.