Java JAXB使用名称空间解组。。怎样?
假设我的有效xml如下所示:Java JAXB使用名称空间解组。。怎样?,java,xml,jaxb,unmarshalling,Java,Xml,Jaxb,Unmarshalling,假设我的有效xml如下所示: <A xmlns="something"> <B>4</B> </A> 我怎样才能让它工作?如果我的xml标记有一些相关元素,如上面的“xmlns”,则JAXB解组器会抛出异常 这是我第一次这么做,所以我对JAXB、解编等都一无所知。我在苦苦挣扎 任何帮助都是好的 编辑 堆栈跟踪: javax.xml.bind.UnmarshalException: unexpected element (uri:"somet
<A xmlns="something">
<B>4</B>
</A>
我怎样才能让它工作?如果我的xml标记有一些相关元素,如上面的“xmlns”,则JAXB解组器会抛出异常
这是我第一次这么做,所以我对JAXB、解编等都一无所知。我在苦苦挣扎
任何帮助都是好的
编辑
堆栈跟踪:
javax.xml.bind.UnmarshalException: unexpected element (uri:"something", local:"A"). Expected elements are <{}B>,<{}A>
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:726)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:247)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:242)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:109)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1131)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:556)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:538)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3132)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:852)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
at ...
javax.xml.bind.UnmarshaleException:意外元素(uri:“something”,local:“A”)。预期要素包括:,
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:726)
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:247)
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:242)
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:109)
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1131)
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.\u startElement(UnmarshallingContext.java:556)
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:538)
位于com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153)
位于com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
在com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374)
位于com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613)
位于com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3132)
在com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:852)
位于com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
在com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
位于com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
在
如果xml文档中有名称空间,那么jaxb注释中也需要有名称空间
例如,像这样:
@XmlRootElement(name = "A")
@XmlAccessorType (XmlAccessType.FIELD)
@Getter //from lombok
public class Data{
@XmlElement(name = "B")
private String b;
public Data(String b) {
this.b = b;
}
public Data() {
}
// Getter/setter generated by lombok.
}
@XmlRootElement(name = "A", namespace="something")
@XmlAccessorType (XmlAccessType.FIELD)
public class Data{
@XmlRootElement(namespace="something", name = "A")
@XmlAccessorType (XmlAccessType.FIELD)
@Getter //from lombok
public class Data{
@XmlElement(namespace="something", name = "B") // <-- mind this
private String b;
public Data(String b) {
this.b = b;
}
public Data() {
}
// Getter/setter generated by lombok.
}
如果xml文档中有名称空间,那么jaxb注释中也需要有名称空间 例如,像这样:
@XmlRootElement(name = "A")
@XmlAccessorType (XmlAccessType.FIELD)
@Getter //from lombok
public class Data{
@XmlElement(name = "B")
private String b;
public Data(String b) {
this.b = b;
}
public Data() {
}
// Getter/setter generated by lombok.
}
@XmlRootElement(name = "A", namespace="something")
@XmlAccessorType (XmlAccessType.FIELD)
public class Data{
@XmlRootElement(namespace="something", name = "A")
@XmlAccessorType (XmlAccessType.FIELD)
@Getter //from lombok
public class Data{
@XmlElement(namespace="something", name = "B") // <-- mind this
private String b;
public Data(String b) {
this.b = b;
}
public Data() {
}
// Getter/setter generated by lombok.
}
从
XmlRootElement
的来源:
public@interface XmlRootElement{
/**
*XML元素的命名空间名称。
*
*如果值为“##default”,则派生XML命名空间名称
*从类({@link XmlSchema})的包中
*如果包未命名,则XML命名空间为默认空
*命名空间。
*/
字符串名称空间()默认值“##默认值”;
//其他文件
您还应该记住,此规则也适用于大多数JAXB注释,因此您需要指定根元素,以及其他元素,并显式指定名称空间,如下所示:
@XmlRootElement(name = "A")
@XmlAccessorType (XmlAccessType.FIELD)
@Getter //from lombok
public class Data{
@XmlElement(name = "B")
private String b;
public Data(String b) {
this.b = b;
}
public Data() {
}
// Getter/setter generated by lombok.
}
@XmlRootElement(name = "A", namespace="something")
@XmlAccessorType (XmlAccessType.FIELD)
public class Data{
@XmlRootElement(namespace="something", name = "A")
@XmlAccessorType (XmlAccessType.FIELD)
@Getter //from lombok
public class Data{
@XmlElement(namespace="something", name = "B") // <-- mind this
private String b;
public Data(String b) {
this.b = b;
}
public Data() {
}
// Getter/setter generated by lombok.
}
@XmlRootElement(namespace=“something”,name=“A”)
@XmlAccessorType(XmlAccessType.FIELD)
@盖特//来自龙目岛
公共类数据{
@XmlElement(namespace=“something”,name=“B”)/来自XmlRootElement
的来源:
public@interface XmlRootElement{
/**
*XML元素的命名空间名称。
*
*如果值为“##default”,则派生XML命名空间名称
*从类({@link XmlSchema})的包中
*如果包未命名,则XML命名空间为默认空
*命名空间。
*/
字符串名称空间()默认值“##默认值”;
//其他文件
您还应该记住,此规则也适用于大多数JAXB注释,因此您需要指定根元素,以及其他元素,并显式指定名称空间,如下所示:
@XmlRootElement(name = "A")
@XmlAccessorType (XmlAccessType.FIELD)
@Getter //from lombok
public class Data{
@XmlElement(name = "B")
private String b;
public Data(String b) {
this.b = b;
}
public Data() {
}
// Getter/setter generated by lombok.
}
@XmlRootElement(name = "A", namespace="something")
@XmlAccessorType (XmlAccessType.FIELD)
public class Data{
@XmlRootElement(namespace="something", name = "A")
@XmlAccessorType (XmlAccessType.FIELD)
@Getter //from lombok
public class Data{
@XmlElement(namespace="something", name = "B") // <-- mind this
private String b;
public Data(String b) {
this.b = b;
}
public Data() {
}
// Getter/setter generated by lombok.
}
@XmlRootElement(namespace=“something”,name=“A”)
@XmlAccessorType(XmlAccessType.FIELD)
@盖特//来自龙目岛
公共类数据{
@xmlement(namespace=“something”,name=“B”)/您所需要的只是向A添加一个@xmldattribute(与相应的getter/setter连接)
编辑:这并不能回答问题,因为问题是关于xml名称空间而不是属性的。您所需要的只是将@XmlAttribute添加到(与相应的getter/setter连接)
编辑:这并没有回答问题,因为问题是关于xml名称空间而不是属性的。你能发布你的代码和异常吗?b
字段不需要getter和setter方法吗?是的,我正在使用lombok.:@getter注释来自lombok。你能发布你的代码和异常吗?b
field需要getter和setter方法吗?确实需要,我正在使用lombok.:)@getter注释来自lombok。好的..另一个问题,如果我有多个“名称空间”怎么办?好的..另一个问题,如果我有多个“名称空间”怎么办?哦,好的!如果我有多个不同的名称空间怎么办?然后您更改cor的名称空间属性响应XmlRootElement
,XmlElement
,xmldattribute
,等等。我的意思是,我假设您的xsi
引用了XMLSchema实例名称空间。然后您将添加一个字符串字段,并用@xmldattribute(名称空间=java.xml.xmlstants.W3C_xml_SCHEMA_实例_NS_URI,name=“type”)对其进行注释
获取您在xsi:type
属性中设置的值。哦!那么名称空间都是一些已经定义为xml格式一部分的元素。好吧。我不知道。非常感谢!我会在解组工作后将此标记为答案。我将