2013-05-29 37 views
3

我正在使用JAXB解析器将通过http请求发送的XML转换为Java对象,同时根据我的XSD架构对其进行验证。问题是,当解组()方法被调用它会引发此异常:JAXB Unmarshaller - 意外的元素异常

javax.xml.bind.UnmarshalException:意外的元素 (URI: “http://www.somedomain.com/”,当地 “分配”)。预计元素 有(无)

如果我从我的根XML元素删除的命名空间它将产生一个URI部分为空同样的异常:

javax.xml.bind.UnmarshalException:意外元素 (uri:“”,local:“assign”)。预计元素 有(无)

解组代码:

  ServletInputStream xmlFile = request.getInputStream(); 

      SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
      Schema schema = sf.newSchema(new File("PatientAssignment.xsd")); 

      JAXBContext jc = JAXBContext.newInstance(AssignType.class); 

      Unmarshaller unmarshaller = jc.createUnmarshaller(); 
      unmarshaller.setSchema(schema); 
      unmarshaller.setEventHandler(new AssignValidationEventHandler(patientResponses)); 
      assignments = (AssignType) unmarshaller.unmarshal(xmlFile); 

我的Java类和package-info.java:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "AssignType", namespace = "http://www.somedomain.com/", propOrder = { 
    "patient" 
}) 
public class AssignType { 
    @XmlElement(namespace = "http://www.somedomain.com/", required = true) 
    protected List<PatientAssignType> patient; 

    /* Getters and setters ommitted */ 
} 

// package-info.java 
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.somedomain.com/", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 

我试图解析XML:

<?xml version="1.0" encoding="UTF-8"?> 
<assign xmlns="http://www.somedomain.com/"> 
    <patientAssign xmlns="http://www.somedomain.com/"> 
     <firstName>Buddy</firstName> 
     <lastName>Holly</lastName> 
     <email></email> 
     <dob></dob> 
     <phone></phone> 
       ... 
    </patientAssign> 
</assign> 

如果有人不能如果我错了,我会非常感激!

+0

请将您的PatientAssignType类添加到问题中。 – Perception

+0

仅供参考 - 由于您在'@ XmlSchema'注释中指定了命名空间和elementFormDefault,因此您无需在其他位置指定它(请参阅:http://blog.bdoughan.com/2010/08/jaxb-namespaces的.html)。 –

回答

4

您需要AssignType类的@XmlRootElement注释。您可能还需要将name=patientAssign添加到您的患者实例变量。

+0

我不确定你的意思是向患者实例变量添加“name = patientAssign”,但添加@XMLRootElement注释使异常消失。感谢您让我摆脱困境! – rawkfist0215