Sie können viele Fragen wie diese auf dieser Website finden, aber keine hat mein Problem gelöst.
Das ist mein XML:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<lookupInstances xmlns='http://www.pqr.com/awd/rest/v1' name='LKIMGR'>
<lookupParameters>
<lookupParameter name='businessArea'>PQAA</lookupParameter>
<lookupParameter name='MEMBERNUMBER'>ANTHONY1900</lookupParameter>
</lookupParameters>
</lookupInstances>
Ich habe die Jaxb-Klasse mit dem XJC-Compiler erstellt, und die erstellte Datei lautet wie folgt:
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 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: 2015.01.13 at 12:15:41 PM IST
//
package com.dsths.ga.awd.main;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
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 name="lookupParameters">
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="lookupParameter">
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
* </restriction>
* </complexContent>
* </complexType>
* </element>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </element>
* </sequence>
* <attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"lookupParameters"
})
@XmlRootElement(name = "lookupInstances")
public class LookupInstances {
@XmlElement(required = true)
protected LookupInstances.LookupParameters lookupParameters;
@XmlAttribute
protected String name;
/**
* Gets the value of the lookupParameters property.
*
* @return
* possible object is
* {@link LookupInstances.LookupParameters }
*
*/
public LookupInstances.LookupParameters getLookupParameters() {
return lookupParameters;
}
/**
* Sets the value of the lookupParameters property.
*
* @param value
* allowed object is
* {@link LookupInstances.LookupParameters }
*
*/
public void setLookupParameters(LookupInstances.LookupParameters value) {
this.lookupParameters = value;
}
/**
* Gets the value of the name property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getName() {
return name;
}
/**
* Sets the value of the name property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setName(String value) {
this.name = value;
}
/**
* <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 name="lookupParameter">
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
* </restriction>
* </complexContent>
* </complexType>
* </element>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"lookupParameter"
})
public static class LookupParameters {
@XmlElement(required = true)
protected LookupInstances.LookupParameters.LookupParameter lookupParameter;
/**
* Gets the value of the lookupParameter property.
*
* @return
* possible object is
* {@link LookupInstances.LookupParameters.LookupParameter }
*
*/
public LookupInstances.LookupParameters.LookupParameter getLookupParameter() {
return lookupParameter;
}
/**
* Sets the value of the lookupParameter property.
*
* @param value
* allowed object is
* {@link LookupInstances.LookupParameters.LookupParameter }
*
*/
public void setLookupParameter(LookupInstances.LookupParameters.LookupParameter value) {
this.lookupParameter = value;
}
/**
* <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">
* <attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
public static class LookupParameter {
@XmlAttribute
protected String name;
/**
* Gets the value of the name property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getName() {
return name;
}
/**
* Sets the value of the name property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setName(String value) {
this.name = value;
}
}
}
}
Unmarshal Code:
public LookupInstances unmarshallXmlRequest(String xmlReq)
{
LookupInstances instances = null;
try {
JAXBContext jc = JAXBContext.newInstance( LookupInstances.class );
Unmarshaller u = jc.createUnmarshaller();
StringBuffer xmlStr = new StringBuffer( xmlReq );
StringReader strReader = new StringReader( xmlStr.toString() );
StreamSource strSource = new StreamSource(strReader);
Object o = u.unmarshal( strSource );
instances = (LookupInstances)o;
} catch (JAXBException e) {
e.printStackTrace();
}
return instances;
}
Ich habe diesen Fehler erhalten:
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.pqr.com/awd/rest/v1", local:"lookupInstances"). Expected elements are <{}lookupInstances>
Bitte helfen Sie.
Nachfolgend einige Informationen, die helfen sollten:
XML
Nachfolgend finden Sie einen Teil Ihrer XML-Datei. Zu beachten ist das xmlns
-Attribut. Dies ist ein spezielles Attribut und bezieht sich auf die Namensraumqualifizierung innerhalb des XML-Dokuments.
<lookupInstances xmlns='http://www.pqr.com/awd/rest/v1' name='LKIMGR'>
<lookupParameters/>
</lookupInstances>
Nachfolgend finden Sie eine andere Version des XML mit derselben Namensraumqualifizierung:
<abc:lookupInstances xmlns:abc='http://www.pqr.com/awd/rest/v1' name='LKIMGR'>
<abc:lookupParameters/>
</abc:lookupInstances>
Wenn Sie das xmlns
-Attribut entfernen, wird die Namespace-Qualifizierung entfernt. Das Dokument unten entspricht nicht den beiden oben genannten.
<lookupInstances name='LKIMGR'>
<lookupParameters/>
</lookupInstances>
Dein Fehler
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.pqr.com/awd/rest/v1", local:"lookupInstances"). Expected elements are <{}lookupInstances>
Dieser Fehler zeigt an, dass Sie die Namensraumqualifizierung nicht richtig zugeordnet haben.
Mapping der Namesapce-Qualifikation in JAXB
Die Namespace-Qualifizierung in JAXB erfolgt mithilfe der Annotation auf Paketebene @XmlSchema
. Anmerkungen auf Paketebene gehen in package-info.Java
. Unten ist die vollständige Quelle für diese Klasse. Wenn Sie bereits über eine package-info.Java
-Quelldatei verfügen, stellen Sie sicher, dass sie mit den restlichen Klassen kompiliert und verpackt wird.
@XmlSchema(
namespace = "http://www.pqr.com/awd/rest/v1",
elementFormDefault = XmlNsForm.QUALIFIED)
package your_package;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
XML Schema
Wenn Sie Ihr Modell aus einem XML-Schema generieren, stellen Sie sicher, dass diese Namensraumqualifizierung dort ordnungsgemäß definiert ist. Es wird so aussehen:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.pqr.com/awd/rest/v1"
xmlns="http://www.pqr.com/awd/rest/v1"
elementFormDefault="qualified">
</xs:schema>
Veränderung
@XmlRootElement(name = "lookupInstances")
zu
@XmlRootElement( namespace = "http://www.pqr.com/awd/rest/v1", name = "lookupInstances")
Ich habe die Jaxb-Klasse geändert, indem ich die Xsd geändert habe und sie funktioniert jetzt.
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2
// 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: 2015.01.13 at 03:49:52 PM IST
//
package com.dsths.ga.awd.main;
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.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlValue;
/**
* <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 name="lookupParameters">
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="lookupParameter" maxOccurs="unbounded" minOccurs="0">
* <complexType>
* <simpleContent>
* <extension base="<http://www.w3.org/2001/XMLSchema>string">
* <attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
* </extension>
* </simpleContent>
* </complexType>
* </element>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </element>
* </sequence>
* <attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"lookupParameters"
})
@XmlRootElement(name = "lookupInstances")
public class LookupInstances {
@XmlElement(required = true)
protected LookupInstances.LookupParameters lookupParameters;
@XmlAttribute(name = "name")
protected String name;
/**
* Gets the value of the lookupParameters property.
*
* @return
* possible object is
* {@link LookupInstances.LookupParameters }
*
*/
public LookupInstances.LookupParameters getLookupParameters() {
return lookupParameters;
}
/**
* Sets the value of the lookupParameters property.
*
* @param value
* allowed object is
* {@link LookupInstances.LookupParameters }
*
*/
public void setLookupParameters(LookupInstances.LookupParameters value) {
this.lookupParameters = value;
}
/**
* Gets the value of the name property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getName() {
return name;
}
/**
* Sets the value of the name property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setName(String value) {
this.name = value;
}
/**
* <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 name="lookupParameter" maxOccurs="unbounded" minOccurs="0">
* <complexType>
* <simpleContent>
* <extension base="<http://www.w3.org/2001/XMLSchema>string">
* <attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
* </extension>
* </simpleContent>
* </complexType>
* </element>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"lookupParameter"
})
public static class LookupParameters {
protected List<LookupInstances.LookupParameters.LookupParameter> lookupParameter;
/**
* Gets the value of the lookupParameter 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 lookupParameter property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getLookupParameter().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link LookupInstances.LookupParameters.LookupParameter }
*
*
*/
public List<LookupInstances.LookupParameters.LookupParameter> getLookupParameter() {
if (lookupParameter == null) {
lookupParameter = new ArrayList<LookupInstances.LookupParameters.LookupParameter>();
}
return this.lookupParameter;
}
/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType>
* <simpleContent>
* <extension base="<http://www.w3.org/2001/XMLSchema>string">
* <attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" />
* </extension>
* </simpleContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"value"
})
public static class LookupParameter {
@XmlValue
protected String value;
@XmlAttribute(name = "name")
protected String name;
/**
* Gets the value of the value property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getValue() {
return value;
}
/**
* Sets the value of the value property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setValue(String value) {
this.value = value;
}
/**
* Gets the value of the name property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getName() {
return name;
}
/**
* Sets the value of the name property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setName(String value) {
this.name = value;
}
}
}
}
Es scheint, dass die von JAXB erstellte Klasse keine Informationen zum Namespace enthält:
@XmlType(name = "", propOrder = {
"lookupParameters"
})
Ich vermute, dass es diesen Fehler verursacht, einfach weil es keinen Namespace erwartet:
javax.xml.bind.UnmarshalException: unerwartetes Element (uri: " http://www.pqr.com/awd/rest/v1 ", local: "lookupInstances"). Erwartete Elemente sind <{} LookupInstances>
Ich bin nicht sicher, warum der generierten Klasse diese Informationen fehlen, aber ich fange damit an, sie manuell hinzuzufügen, um zu überprüfen, ob dies das Problem ist:
@XmlType(name = "", namespace= "http://www.pqr.com/awd/rest/v1", propOrder = {
"lookupParameters"
})
@XmlSchema(namespace = "http://www.pqr.com/awd/rest/v1",
elementFormDefault = XmlNsForm.QUALIFIED) package your_package;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
Dieser Teil ist für JAXB-generierte Klassen sehr wichtig, insbesondere wird elementFormDefault = XmlNsForm.QUALIFIED
nicht automatisch von der JAXB hinzugefügt.
Danke, Blaise, deine Antwort hat mir geholfen.
Zunächst müssen Sie die XML-Eingabedatei überprüfen. Stellen Sie sicher, dass die Eingabe-XML das gleiche Wurzelelement wie Ihre XSD-Datei haben muss (mit dem Sie die JAXb-Klassen erstellt haben) Bitte versuchen Sie es unter XML, es funktioniert gut :)
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<lookupInstances name='LKIMGR'>
<lookupParameters>
<lookupParameter name='businessArea'>PQAA</lookupParameter>
<lookupParameter name='MEMBERNUMBER'>ANTHONY1900</lookupParameter>
</lookupParameters>
</lookupInstances>