我有两个XSD,其中一个XSD包含一个元素,该元素可以包含第二个XSD中的元素。基本上,XSD1有一个元素“etta”,它可以包含XSD2中的任何元素。
我使用xjc生成类,当它被反序列化时,元元素将XSD2中的元素作为JAXBElements包含,而不是XSD2中生成的实际类。我在我的程序中包含了这两组类,包信息是正确的。
这就是我定义XSD的方式。我想问题在于我的“任何”元素。
<xs:schema xmlns="NS1" elementFormDefault="qualified"
xmlns:ns1="NS2"
targetNamespace="NS1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="NS2" schemaLocation="./NS2.xsd" />
<xs:complexType name="Meta">
<xs:sequence>
<xs:any namespace="NS2" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
...
</xs:schema>
因此,基本上我希望元素的意思是“这里有一个或多个在XSD2中定义的元素”,并希望jaxb将其解组。
我应该如何更改XSD以帮助jaxb使用XSD2中的元素反序列化元的内容?
--编辑-
这是xjc为Meta类生成的:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Meta", propOrder = {
"any"
})
public class Meta
extends BaseObject
{
@XmlAnyElement(lax = true)
protected List<Object> any;
public List<Object> getAny() {
if (any == null) {
any = new ArrayList<Object>();
}
return this.any;
}
}
--编辑原始XSD2(更改NS以匹配问题)--
<xs:schema xmlns="NS2" elementFormDefault="qualified" targetNamespace="syncml:NS2" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="MetInf">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" ref="FieldLevel" />
<xs:element minOccurs="0" maxOccurs="1" ref="Format" />
<xs:element minOccurs="0" maxOccurs="1" ref="Type" />
<xs:element minOccurs="0" maxOccurs="1" ref="Mark" />
<xs:element minOccurs="0" maxOccurs="1" ref="Size" />
<xs:element minOccurs="0" maxOccurs="1" ref="Anchor" />
<xs:element minOccurs="0" maxOccurs="1" ref="Version" />
<xs:element minOccurs="0" maxOccurs="1" ref="NextNonce" />
<xs:element minOccurs="0" maxOccurs="1" ref="MaxMsgSize" />
<xs:element minOccurs="0" maxOccurs="1" ref="MaxObjSize" />
<xs:element minOccurs="0" maxOccurs="unbounded" ref="EMI" />
<xs:element minOccurs="0" maxOccurs="1" ref="Mem" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="FieldLevel">
<xs:complexType />
</xs:element>
<xs:element name="Format" type="xs:string" />
<xs:element name="Type" type="xs:string" />
<xs:element name="Mark" type="xs:string" />
<xs:element name="Size" type="xs:string" />
<xs:element name="Anchor">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" ref="Last" />
<xs:element ref="Next" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Last" type="xs:string" />
<xs:element name="Next" type="xs:string" />
<xs:element name="Version" type="xs:string" />
<xs:element name="NextNonce" type="xs:string" />
<xs:element name="MaxMsgSize" type="xs:string" />
<xs:element name="MaxObjSize" type="xs:string" />
<xs:element name="EMI" type="xs:string" />
<xs:element name="Mem">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" ref="SharedMem" />
<xs:element ref="FreeMem" />
<xs:element ref="FreeID" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="FreeID" type="xs:string" />
<xs:element name="FreeMem" type="xs:string" />
<xs:element name="SharedMem">
<xs:complexType />
</xs:element>
</xs:schema>
--这就是在我的XSD1中使用Meta的方式:
<xs:element name="TargetRef" type="xs:string" />
<xs:element name="VerDTD" type="xs:string" />
<xs:element name="VerProto" type="xs:string" />
<xs:element name="Item">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" ref="Target" />
<xs:element minOccurs="0" maxOccurs="1" ref="Source" />
<xs:element minOccurs="0" maxOccurs="1" ref="SourceParent" />
<xs:element minOccurs="0" maxOccurs="1" ref="TargetParent" />
<xs:element minOccurs="0" maxOccurs="1" ref="Meta" />
<xs:element minOccurs="0" maxOccurs="1" ref="Data" />
<xs:element minOccurs="0" maxOccurs="1" ref="MoreData" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Meta" type="xs:string" />
<xs:element name="Correlator" type="xs:string" />
<xs:element name="Data" type="xs:string" />
像这样的某物怎么样:
将第二个xsd中所有可能的元素插入序列中,同时在序列中定义minOccurs和maxOccurs,而不是元素本身。(代码来自此处-示例2)
<xs:element name="Meta">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="elements" type="ns1:typeA"/>
<xs:element name="from" type="ns1:typeB"/>
<xs:element name="NS2" type="ns1:typeC"/>
</xs:sequence>
</xs:complexType>
</xs:element>
另一个选项需要稍微改变第二个xsd:
第2-4行不是这样的:
<xs:element name="MetInf">
<xs:complexType>
<xs:sequence>
它们必须看起来像这样:
<xs:complexType name="MetInf">
<xs:sequence>
NS1.xsd是这样的:
<xs:schema
xmlns="NS1"
elementFormDefault="qualified"
targetNamespace="NS1"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ns1="NS2">
<xs:import namespace="NS2" schemaLocation="NS2.xsd" />
<xs:complexType name="Meta">
<xs:sequence>
<xs:element name="metaInf" type="ns1:MetInf" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
当使用firstSchema.xsd和NS2.xsd在同一个目录中运行xjc时,会生成以下类:
ns2/Anchor.java
ns2/FieldLevel.java
ns2/Mem.java
ns2/MetInf.java
ns2/ObjectFactory.java
ns2/SharedMem.java
ns2/package-info.java
ns1/Meta.java
ns1/ObjectFactory.java
ns1/package-info.java
我为第一个模式得到的元类。xsd如下所示:
public class Meta {
@XmlElement(required = true)
protected List<MetInf> metaInf;
public List<MetInf> getMetaInf() {
if (metaInf == null) {
metaInf = new ArrayList<MetInf>();
}
return this.metaInf;
}
}
这和你需要的差不多吗?
问题内容: 在1.6.0_16 JDK上工作时,我使用Apache CXF 2.5.2从WSDL生成了存根类,Apache CXF 2.5.2使用了最新的jaxb- api 2.2。我知道可以使用jaxb-api 2.1,但是为了避免兼容性问题,我宁愿使用当前版本。由于我的JDK具有jaxb 2.1,因此构建失败并显示以下消息: 因此,我尝试使用以下依赖项使Maven包括最新的jaxb api和i
嗨,我正在解组一个XML文件,该文件有一个标记,可以包含值或元素列表。我想知道解组这种XML的最佳方法是什么。例子: 我无法改变XML的构建方式,因此我希望有人能给出答案。非常感谢。
问题内容: 我正在尝试从以下站点显示游戏的标题和ID:http ://thegamesdb.net/api/GetGame.php?id =2 当我从以下URL解组时:http : //www.w3schools.com/xml/note.xml没关系,但这只是一个对象,而不是列表。所以我现在有问题。我正在阅读Google的一些教程和示例,并编写了以下代码: Data.java: Game.jav
我有下面的JAXB注释类(用XJC生成) 当以下面的方式解组它时,一切都很好: 当按以下方式解组时,它将崩溃,出现异常 例外: 有人能解释这种奇怪的行为吗? 正在解组的XML文件粘贴在下面:
在不使用getter和setter的情况下,JAXB可以正确地解组所提供的JSON。 null和“null”是完全不同的东西,但是我不想在POJO中包含这个字段,并且我必须忽略这些null值。 编辑
所以我有几个XML,我正在尝试解封。 一个XML可以如下所示: 在我的Table类中 } 我从这个链接获取了MapAdapter:JAXB封送和反封送映射到/从 value 我的问题是:我希望能够在传入XML时将记录中的每个标记名(Doc_id/sub_id或XML中的任何内容)及其每个值作为字符串获取,但我不确定如何实现。 如果能给我指明正确的方向,我将不胜感激。 编辑: 2个新问题!我意识到我