gpt4 book ai didi

java - 如何指定 JAXB 用于编码/解码数据的适配器?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:13:35 25 4
gpt4 key购买 nike

有没有一种方法可以指定 JAXB 用于在我的 XML 模式中编码/取消编码对象的适配器?

例如,如果我想将以下内容解析为整数:

<SpecialValue>0x1234</SpecialValue>

我可以在我的架构中使用以下内容:

<xs:simpleType name="HexInt">
<xs:annotation>
<xs:appinfo>
<jaxb:javaType name="int" parseMethod="Integer.decode" />
</xs:appinfo>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:pattern value="0x[0-9a-fA-F]+" />
</xs:restriction>
</xs:simpleType>
<xs:element name="SpecialValue" type="HexInt" />

当我通过 XJC 工具运行模式时,应使用 Integer.decode() 将字符串“0x1234”解码为值为 0x1234 或十进制的 4660 的整数。生成的适配器类正确地反射(reflect)了这一点:

public Integer unmarshal(String value) {
return (Integer.decode(value));
}

但是,当我想将该值编码回 XML 元素(这是一个字符串文字)时,Adapter 类会执行以下操作:

public String marshal(Integer value) {
if (value == null) {
return null;
}
return value.toString();
}

在这种情况下,整数 0x1234(十进制为 4660)的字符串值为“4660”,这不符合我的模式(因为它没有“0x”前缀)。

如何告诉适配器我希望将整数 0x1234 编码为“0x1234”字符串文字?我希望能够在模式中执行此操作,这样我就可以生成新的 Java 类而无需修改输出。这可能吗?

编辑:根据已接受的答案,我做了以下工作:

我在 com.example.Parse 类中写了一个名为 toHexString() 的方法:

public static String toHexString(int value)
{
return ("0x" + Integer.toHexString(value));
}

然后我将我的架构指向该打印方法:

<xs:simpleType name="HexInt">
<xs:annotation>
<xs:appinfo>
<jaxb:javaType name="int" parseMethod="Integer.decode" printMethod="com.example.Parse.toHexString" />
</xs:appinfo>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:pattern value="0x[0-9a-fA-F]+" />
</xs:restriction>
</xs:simpleType>

最佳答案

非常相似的问题:“How to map String coordinates to java.awt.Point?”

(0) 架构

<xsd:simpleType name="Point">
<xsd:restriction base="xsd:string">
<xsd:pattern value="([0-9])+,([0-9])+" />
</xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="HexAreaBorder">
<xsd:sequence minOccurs="1" maxOccurs="1">
<xsd:element minOccurs="1" maxOccurs="1" name="type" type="xsd:string" />
<xsd:element minOccurs="1" maxOccurs="1" name="name" type="xsd:string" />
<xsd:element name="points" type="Point" minOccurs="1" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>

(1) 创建扩展 XmlAdapter 的适配器类。

package com.kjcode.hexgrid.jaxbadapter;
import java.awt.Point;

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

public class PointAdapter extends XmlAdapter<String, Point> {

@Override
public Point unmarshal(String v) throws Exception {
String[] coords = v.split(",");
return new Point(Integer.parseInt(coords[0]), Integer.parseInt(coords[1]));
}

@Override
public String marshal(Point v) throws Exception {
return String.format("%d,%d", v.x, v.y);
}
}

(2) 创建绑定(bind)文件。关键是添加:jaxb:extensionBindingPrefixes="xjc"xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:extensionBindingPrefixes="xjc" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns="hexmap" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
jaxb:version="2.1">

<jaxb:bindings schemaLocation="hexmap.xsd">
<jaxb:globalBindings>
<xjc:javaType adapter="com.kjcode.hexgrid.jaxbadapter.PointAdapter" name="java.awt.Point" xmlType="Point" />
</jaxb:globalBindings>
</jaxb:bindings>
</jaxb:bindings>

(3)配置pom.xml

<plugin>
<groupId>com.sun.tools.xjc.maven2</groupId>
<artifactId>maven-jaxb-plugin</artifactId>
<version>1.1.1</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<generatePackage>com.kjcode.hexmap.api.logic.field.generated</generatePackage>
<extension>true</extension>
</configuration>
</plugin>

(4) JAXB会生成

public class HexAreaBorder {

@XmlElement(required = true)
protected String type;
@XmlElement(required = true)
protected String name;
@XmlElement(required = true, type = String.class)
@XmlJavaTypeAdapter(PointAdapter.class)
protected List<Point> points = new LinkedList<Point>();

关于java - 如何指定 JAXB 用于编码/解码数据的适配器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5957708/

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