2016-07-22 61 views
1

多年以来,由于没有处理过XML模式,因此在使用XML Spy中生成的模式手动解组某些XML时遇到了问题。JAXB unmarshalling模式问题:'org.xml.sax.SAXParseException cvc-elt.1'

对于我的生活,我无法解决它,尽管各种其他谷歌类似的问题/答案!

下面是XML(大大减少只是为了突出这个问题):

<myelement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./myxsd.xsd"> 
</myelement> 

这里的myxsd.xsd架构(大大减少只是为了突出这个问题):

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://myhost.com/Elements" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" targetNamespace="http://myhost.com/Elements" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1"> 
    <xs:element name="myelement"/> 
</xs:schema> 

下面的代码:

String xml = ""; //input the XML from above. 
JAXBContext context = 
    JAXBContext.newInstance(MyElement.class); 

Unmarshaller unmarshaller = context.createUnmarshaller(); 

document = (MyElement) unmarshaller.unmarshal(new StringReader(xml)); 

和元素POJO:

@XmlRootElement(name = "myelement", namespace = "http://myhost.com/Elements") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "myelementType", namespace = "http://myhost.com/Elements") 
public class MyElement { 
} 

,导致:

javax.xml.bind.UnmarshalException - with linked exception:[org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 110; cvc-elt.1: Cannot find the declaration of element ‘myelement’.] 
+0

实际代码中的XML是否是字符串?任何理由不只是将文件提供给unmarhsal()? – milez

+0

这只是示例代码,但传入的XML仍会导致相同的错误。但是,谢谢。 – deanpullen

回答

0

似乎一个空间存在“我的元素”。检查myxsd.xsd文件

+0

谢谢,但那里似乎没有空间? – deanpullen

+0

然后消息找不到元素'我的元素'的声明。很奇怪,因为它看起来像有一个空间。也许调试萨克斯失败可能会有所帮助 –

+0

啊道歉;我没有意识到你在错误中的意思 - 这只是我复制和粘贴,然后编辑错误,为了使类匿名等,空间不应该在那里,我已经更新了错误。谢谢! – deanpullen

0
public static MyElement unmarshal(String str) throws JAXBException { 
JAXBContext jaxbContext = JAXBContext.newInstance(MyElement.class); 
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 

JAXBElement<MyElement> root = jaxbUnmarshaller.unmarshal(new StreamSource(new StringReader(str))), MyElement.class); 
MyElement el = root.getValue(); 

return el; 
} 

也许类似上述。