当前位置: 首页 > 知识库问答 >
问题:

Jaxb和解组包括XSD

鄂琛
2023-03-14

我有两个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" />

共有1个答案

尚俊楠
2023-03-14

像这样的某物怎么样:

将第二个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个新问题!我意识到我