gpt4 book ai didi

Jaxb:xs:属性空值

转载 作者:行者123 更新时间:2023-12-04 13:54:40 25 4
gpt4 key购买 nike

注册:Jaxb

我基本上是在尝试在 JAXB 中设置一个角色,即每当遇到空字段时,而不是在输出中忽略它,而是将其设置为空值。

对于 xmlElement 我得到的答案就像我们需要使用 nillable="true"但是我们需要如何设置空值。通过谷歌搜索,我发现我们需要使用 use="optional"但它不适用于我的情况。

我的xsd部分如下:

 <xs:attribute name="RomVersion" type="xs:string" use="required" /> 
<xs:attribute name="MACAddress" type="xs:string" use="required" />
<xs:attribute name="LargestFreeBlock" type="xs:unsignedInt" use="required" />
<xs:attribute name="TimeSinceLastReset" type="xs:unsignedInt" use="optional" />
<xs:attribute name="ResetReason" type="xs:string" use="optional" />
<xs:attribute name="TimeStamp" type="xs:unsignedInt" use="optional" />
<xs:attribute name="ECOList" type="xs:string" use="optional" />
</xs:complexType>
</xs:element>

如果有人知道,请尽快给我解决方案。

最佳答案

从 XML 模式开始

previous answer我描述了从 Java 对象开始时如何解决您的用例。根据您对该答案的评论,此答案描述了从 XML 模式生成模型时如何完成相同的事情。

XML 模式 (attributeAdapter.xsd)

对于此示例,我们将使用以下 XML 模式:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema
elementFormDefault="qualified"
targetNamespace="http://www.example.com/adapter"
xmlns:nytd="http://www.example.com/adapter"
xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="root">
<xs:complexType>
<xs:attribute name="foo" type="xs:string"/>
<xs:attribute name="bar" type="xs:string"/>
</xs:complexType>
</xs:element>

</xs:schema>

字符串转换器

我们需要定义一个类来进行特殊的字符串处理。对于这个用例,我们希望在 XML 文档中将空字段/属性值视为空字符串 (""):
package com.example.adapter;

public class StringConverter {

public static String parseString(String value) {
if("".equals(value)) {
return null;
}
return value;
}

public static String printString(String value) {
if(null == value) {
return "";
}
return value;
}

}

绑定(bind)文件 (attributeAdapterBinding.xml)

我们将需要使用 JAXB 绑定(bind)文件来自定义类生成。下面的绑定(bind)文件将允许我们利用上面定义的 StringConverter 类:
<jaxb:bindings 
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jaxb:bindings schemaLocation="attributeAdapter.xsd">
<jaxb:bindings node="//xs:element[@name='root']/xs:complexType">
<jaxb:bindings node="xs:attribute[@name='foo']">
<jaxb:property>
<jaxb:baseType>
<jaxb:javaType name="java.lang.String"
parseMethod="com.example.adapter.StringConverter.parseString"
printMethod="com.example.adapter.StringConverter.printString"/>
</jaxb:baseType>
</jaxb:property>
</jaxb:bindings>
<jaxb:bindings node="xs:attribute[@name='bar']">
<jaxb:property>
<jaxb:baseType>
<jaxb:javaType name="java.lang.String"
parseMethod="com.example.adapter.StringConverter.parseString"
printMethod="com.example.adapter.StringConverter.printString"/>
</jaxb:baseType>
</jaxb:property>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>

许继电来电

我们将按如下方式进行 XJC 调用:
xjc -d out -b attributeAdapterBinding.xml attributeAdapter.xsd

域模型(根)

我们在绑定(bind)文件中自定义的字段/属性会用@XmlJavaTypeAdapter注解;
package com.example.adapter;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = "root")
public class Root {

@XmlAttribute
@XmlJavaTypeAdapter(Adapter1 .class)
protected String foo;

@XmlAttribute
@XmlJavaTypeAdapter(Adapter2 .class)
protected String bar;

public String getFoo() {
return foo;
}

public void setFoo(String value) {
this.foo = value;
}

public String getBar() {
return bar;
}

public void setBar(String value) {
this.bar = value;
}

}

XmlAdapter (Adapter1)

生成的 XmlAdapter 类将如下所示。请注意它如何利用我们的 StringConverter 类:
package com.example.adapter;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class Adapter1 extends XmlAdapter<String, String> {

public String unmarshal(String value) {
return (com.example.adapter.StringConverter.parseString(value));
}

public String marshal(String value) {
return (com.example.adapter.StringConverter.printString(value));
}

}

演示

现在,如果我们运行以下演示代码:
package com.example.adapter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);

Root root = new Root();
root.setFoo(null);
root.setBar(null);

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}

}

输出

我们将获得所需的输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns="http://www.example.com/adapter" foo="" bar=""/>

更新(备用绑定(bind)文件)

或者,如果您希望将适配器应用于 xsd:string 类型的所有属性然后你可以使用一个看起来像这样的绑定(bind)文件;
<jaxb:bindings 
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jaxb:globalBindings>
<jaxb:javaType
name="String"
xmlType="xs:string"
parseMethod="com.example.adapter.StringConverter.parseString"
printMethod="com.example.adapter.StringConverter.printString"/>
</jaxb:globalBindings>

</jaxb:bindings>

关于Jaxb:xs:属性空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5989922/

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