gpt4 book ai didi

java - 可针对 JAXB 更改的 xml 文件的 XSD 架构

转载 作者:行者123 更新时间:2023-11-30 11:48:29 24 4
gpt4 key购买 nike

您好,我刚刚开始学习 xsd,因为我想将它与 JAXB 一起使用。

我想知道我可能有一个以相同元素开头但每次都可能有完全不同的子元素的 XML 标记。

这是一个例子1:

    <service>Hotel
<request>location
<currentLongitude>100</currentLongitude>
<currentLatitude>100</currentLatitude>
</request>
</service>

例子2:

    <service>Hotel
<request>Price
<Single>130</Single>
<Double>140</Double>
</request>
</service>

基本上我如何在 xsd 中编写这个被询问的“请求”可以有完全不同的元素

或者,如果它适用,那么 JAXB 是否是我处理此 xml 的更好方法?

谢谢

最佳答案

您可以将 request 元素定义为:

<xsd:element name="request">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

这将导致 JAXB 生成注释如下的字段/属性:

@XmlMixed
@XmlAnyElement(lax = true)
protected List<Object> content;

完整示例

任何.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="service">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="request"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:element name="request">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

</xsd:schema>

新江西来电

xjc -d out -p forum8776746 any.xsd

服务

package forum8776746;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"request"
})
@XmlRootElement(name = "service")
public class Service {

@XmlElement(required = true)
protected Request request;

public Request getRequest() {
return request;
}

public void setRequest(Request value) {
this.request = value;
}

}

请求

package forum8776746;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlMixed;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"content"
})
@XmlRootElement(name = "request")
public class Request {

@XmlMixed
@XmlAnyElement(lax = true)
protected List<Object> content;

public List<Object> getContent() {
if (content == null) {
content = new ArrayList<Object>();
}
return this.content;
}

}

关于java - 可针对 JAXB 更改的 xml 文件的 XSD 架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8776746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com