javax.xml.bind.UnmarshalException: अप्रत्याशित तत्व (uri: "", स्थानीय: "समूह")


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उत्पन्न-स्रोतों से गलत का उपयोग करने के कारण हो सकता है, जो कि यदि आप दो अलग-अलग स्रोत निर्देशिकाओं को मिला रहे हैं, तो अधिक संभावना है।
बबार्कर

जवाबों:


119

ऐसा लगता है कि आपके XML दस्तावेज़ में "समूह" के बजाय मूल तत्व "समूह" है। आप ऐसा कर सकते हैं:

  1. अपने XML पर मूल तत्व को "समूह" में बदलें
  2. समूह वर्ग में एनोटेशन @XmlRootElement (नाम = "समूह") जोड़ें।

2
यह समस्या हल हो गई, धन्यवाद! मैंने दूसरा समाधान, @XmlRootElement (नाम = "समूह") का उपयोग किया। मेरा वर्ग नाम समूह है, और XML मूल तत्व समूह है, मुझे अभी भी नाम की आवश्यकता क्यों है = "समूह"
user496949

1
बाहर की जाँच करें: stackoverflow.com/questions/5203531/…
bdouagan

2
@BiseiseDouagan मुझे बिल्कुल विपरीत समस्या हो रही है, मेरे पास है @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!
राहुल ठाकुर

4
साथ में कोई समस्या हुई @XmlSchemaमें package-info.java, अब तय की।
राहुल ठाकुर

35

आपको अपने उत्पन्न किए गए jaxb पैकेज में पैकेज-info.java डालना होगा। इसकी सामग्री कुछ इस तरह होनी चाहिए

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

33

सौभाग्य से, पैकेज-जानकारी वर्ग की आवश्यकता नहीं है। मैं iowatiger08 समाधान के साथ खदान की समस्या को ठीक करने में सक्षम था।

यहाँ कुछ के लिए डॉट्स में शामिल होने में मदद करने के लिए त्रुटि संदेश दिखाते हुए मेरा फिक्स है।

त्रुटि संदेश

javax.xml.bind.UnmarshalException: अनपेक्षित तत्व (uri: " http://global.aon.bz/schema/cbs/archive/errorresource/0 ", स्थानीय: "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 में जोड़े गए नामस्थान देख सकते हैं।


उसी मुद्दे का सामना किया और आपकी टिप्पणी का अनुसरण किया और समस्या हल हो गई। धन्यवाद।
बिबिन ज़चरियास

9

अधिक देखने के बाद, मूल तत्व को स्कीमा-नेमस्पेस के साथ जोड़ा जाना चाहिए क्योंकि ब्लिस नोटिंग है। फिर भी, मैं एक पैकेज जानकारी जावा नहीं है। तो @XMLSchema एनोटेशन का उपयोग किए बिना, मैं उपयोग करके इस समस्या को ठीक करने में सक्षम था

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

उम्मीद है की यह मदद करेगा!


एक जड़ तत्व चट्टानों के लिए एक नामस्थान जोड़ने! :-)
कोन्स्टेंटिन इवानोव

5

यह एक सुंदर आला उपयोग के लिए एक मामला है, लेकिन यह मुझे हर बार मिलता है। यदि आप एक्लिप्स जैक्सब जनरेटर का उपयोग कर रहे हैं, तो यह पैकेज-जानकारी नामक एक फाइल बनाता है।

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

यदि आप इस फ़ाइल को हटाते हैं तो यह अधिक सामान्य xml को पार्स करने की अनुमति देगा। कोशिश करो!


1
यह उसके बाद एकदम सही है .. बहुत बहुत धन्यवाद .. :)। मैंने सिर्फ रिक्त स्ट्रिंग में उल्लिखित नाम स्थान बनाया है।
अरुणदेव

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
}

मेरा क्षेत्रवादी वर्ग:

@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 पैकेज में कक्षा डालने और कोड को उसी कक्षा में रखने की आवश्यकता है:

@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 = "योग्य" विशेषताFormDefault = "अयोग्य" के लिए निम्नलिखित विशेषताएं <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" >

और xjc चलाकर जावा क्लासेस को फिर से तैयार किया, जिसने पैकेज-info.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

मेरे पास एक ही मुद्दा था, मेरी समस्या यह थी, कि मेरे पास दो अलग-अलग wsdl-files के साथ दो अलग-अलग webservices थी। मैंने दोनों वेबसर्विसेज के लिए एक ही पैकेज में स्रोत उत्पन्न किए, जो एक समस्या लगती है। मुझे लगता है कि यह ObjectFactory के कारण है और शायद पैकेज-info.java के कारण भी - क्योंकि वे केवल एक बार उत्पन्न होते हैं।

मैंने इसे एक अलग पैकेज में प्रत्येक webservice के लिए स्रोतों को उत्पन्न करके हल किया। इस तरह, आपके पास दो अलग-अलग ObjectFactories और package-info.java फाइलें भी हैं।


0

मामले में आप पागल हो रहे हैं क्योंकि यह केवल आपके टेस्ट में होता है और आप पॉवरमॉक का उपयोग कर रहे हैं यह समाधान है, इसे अपने परीक्षण वर्ग के शीर्ष पर जोड़ें:

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

0

यहां बताए गए किसी भी समाधान ने मेरे लिए काम नहीं किया, मैं अभी भी मिल रहा था:

थ्रेड में अपवाद "मुख्य" javax.xml.bind.UnmarshalException: अप्रत्याशित तत्व (uri: "java: XXX.XX.XX.XXX", स्थानीय: "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") समूह वर्ग के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.