javax.xml.bind.UnmarshalException: beklenmeyen öğe (uri: "", yerel: "Grup")


104
unexpected element (uri:"", local:"Group"). Expected elements are <{}group>

Xml'den eşleştirme yaparken bir istisna ile tanışın

JAXBContext jc = JAXBContext.newInstance(Group.class); 
Unmarshaller unmarshaller = jc.createUnmarshaller();
Group group = (User)unmarshaller.unmarshal(new File("group.xml"));

Grup sınıfında herhangi bir ek açıklama yoktur ve group.xml yalnızca verileri içerir.

Sebep herhangi bir şey olabilir mi?


4
Buraya bir aramadan gelenler için ObjectFactory, bunun, üretilen kaynaklardan gelen yanlışların kullanılmasından kaynaklanabileceğini belirtmek isterim; bu, iki farklı üretilmiş kaynak dizini karıştırıyorsanız daha olasıdır.
bbarker

Yanıtlar:


119

Görünüşe göre XML belgenizde "grup" yerine "Grup" kök öğesi var. Yapabilirsin:

  1. XML'nizdeki kök öğeyi "grup" olarak değiştirin
  2. @XmlRootElement ek açıklamasını (name = "Group") Group sınıflarına ekleyin.

2
Sorunu çözdü, teşekkürler! İkinci çözümü, @XmlRootElement (name = "Group") kullandım.
Sınıfım


2
@BlaiseDoughan Ben tam tersi bir problem yaşıyorum, var @XmlRootElement(name = "MB") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "MB", propOrder = { "date", "time" })ama her alanda unexpected element (uri:"http://xx.title.com/new/response", local:"MB"). Expected elements are <{}Date>,<{}MB>,<{}Time>benim de var @XmlElement(name="Date", required = true). Nerede ve neden yanlış gidiyor? Ayrıca kaldırmayı da denedim @XmlRootElement!
Rahul Thakur

4
Bir sorun oluştu @XmlSchemain package-info.javaartık sabit.
Rahul Thakur

35

Package-info.java'yı oluşturulan jaxb paketinize koymanız gerekir. İçeriği böyle bir şey olmalı

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

34

Neyse ki, paket bilgisi sınıfı gerekli değildir. İowatiger08 çözümüyle benim sorunumu çözebildim.

İşte bazılarının noktalara katılmasına yardımcı olmak için hata mesajını gösteren düzeltmem.

Hata mesajı

javax.xml.bind.UnmarshalException: beklenmeyen öğe (uri: " http://global.aon.bz/schema/cbs/archive/errorresource/0 ", yerel: "errorresource"). Beklenen öğeler şunlardır: <{} errorresource>

Düzeltmeden önce kod

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="", propOrder={"error"})
@XmlRootElement(name="errorresource")
public class Errorresource

Düzeltmeden sonra kod

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="", propOrder={"error"})
@XmlRootElement(name="errorresource", namespace="http://global.aon.bz/schema/cbs/archive/errorresource/0")
public class Errorresource

Hata mesajında ​​belirtildiği gibi @XmlRootElement'e eklenen ad alanını görebilirsiniz.


Aynı sorunla karşılaştım ve yorumunuzu takip ettiniz ve sorun çözüldü. Teşekkür ederim.
Bibin Zacharias

9

Daha fazlasını araştırdıktan sonra, Blaise'in de belirttiği gibi, kök eleman bir şema ad alanıyla ilişkilendirilmelidir. Yine de bir paket bilgisi java'm yoktu. Dolayısıyla @XMLSchema ek açıklamasını kullanmadan, bu sorunu şu şekilde düzeltebildim:

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

Bu yardımcı olur umarım!


bir kök öğeye bir ad alanı eklemek kayalar! :-)
Konstantin Ivanov

5

Bu oldukça niş kullanım durumu için bir çözüm ama her seferinde beni etkiliyor. Eclipse Jaxb oluşturucusunu kullanıyorsanız, paket bilgisi adlı bir dosya oluşturur.

@javax.xml.bind.annotation.XmlSchema(namespace = "blah.xxx.com/em/feed/v2/CommonFeed")
package xxx.blah.mh.domain.pl3xx.startstop;

Bu dosyayı silerseniz, daha genel bir xml'nin ayrıştırılmasına izin verir. Bir şans ver!


1
Bundan sonra mükemmel uyandı .. Çok teşekkürler dostum .. :). Bahsedilen ad alanını boş dizeye yaptım.
Arundev

2

Aynı sorunu yaşadım .. Bana yardımcı oldu, sınıflarımın alan adlarını xml dosyasındaki etiket isimleriyle aynı şekilde belirtiyorum (dosya harici bir sistemden geliyor).

Örneğin:

Xml dosyam:

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

Yanıt sınıfım:

@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 sınıfım:

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

Öğe sınıfım:

@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 sınıfım:

@XmlRootElement(name="RegionList")
@XmlAccessorType(XmlAccessType.FIELD)
public class RegionList {
    Item[] Item = new Item[1];

    // getters and setters here
}

DemoUnmarshalling sınıfım:

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

O verir:

1
Some name 1
Some code
Some Url
2
Some name 2

1

Sen koymak gerekir package-info.javaait paketinde sınıfını contextPath ve aynı sınıfta kod aşağıda koyun:

@javax.xml.bind.annotation.XmlSchema(namespace = "https://www.namespaceUrl.com/xml/", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.test.valueobject;

0

Benimle aynı. Eşleme sınıfının adı Mbeanancak etiket kök adı idi, mbeanbu yüzden ek açıklamayı eklemem gerekiyordu:

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

0

Ben de aynı sorunu yaşadım. ElementFormDefault = "nitelikli" attributeFormDefault = "nitelenmemiş" öğesine aşağıdaki öznitelikleri ekledim<xs:schema..>

<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" >

ve xjc'yi çalıştırarak, package-info.java'yı düzelten java sınıflarını yeniden oluşturdu.

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

Bu benim için sorunu çözdü.


0

Zaten aynı sorunu yaşıyorum ve aşağıdaki gibi değiştiriyorum:

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

0

Aynı sorunu yaşadım, benim sorunum, iki farklı wsdl dosyasıyla iki farklı web hizmetim olmasıydı. Her iki web hizmeti için kaynakları aynı pakette oluşturdum ki bu bir sorun gibi görünüyor. Sanırım bunun nedeni ObjectFactory ve belki de package-info.java nedeniyle - çünkü bunlar yalnızca bir kez üretiliyor.

Her web hizmeti için kaynakları farklı bir pakette üreterek çözdüm. Bu şekilde, iki farklı ObjectFactories ve package-info.java dosyalarınız da olur.


0

Bu sadece Testlerinizde gerçekleştiği için çıldırıyorsanız ve PowerMock kullanıyorsanız çözüm budur, onu test sınıfınızın üstüne ekleyin:

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

0

Burada bahsedilen çözümlerin hiçbiri benim için işe yaramadı, hala alıyordum:

"Main" iş parçacığında istisna javax.xml.bind.UnmarshalException: beklenmeyen öğe (uri: "java: XXX.XX.XX.XXX", yerel: "XXXXX")

Aşağıdaki kod diğer siteler aracılığıyla yapılan çok araştırmadan sonra benim için çalıştı.

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

Yukarıdakilerden hiçbiri işe yaramazsa, eklemeyi deneyin

@XmlRootElement(name="Group") Grup sınıflarına.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.