java - 将字段编码为具有字段名称的子节点的值属性

标签 java xml jaxb

某处的聪明人设计了这样的 xml:

<node>
  <subnode value="sv1"/>
  <anotherSubNode value="asv" />
</node>

我想将其映射到 POJO 对象,如下所示:

class Node {
  String subnode;
  String anotherSubNode;
  //...
}

而不是

class NodeValue {
  @XmlAttribute
  String value;
}
class Node {
  NodeValue subnode;
  NodeValue anotherSubNode;
  /...
}

有没有一种方法可以使用标准 java xml 编码(marshal)处理来有效地做到这一点?或者甚至是非标准的?

最佳答案

XmlAdapter是最简单、最通用的解决方案。字符串字段的适配器如下所示:

public class NodeValueStringAttrMarshaller extends XmlAdapter<NodeValueElement, String> {

    @Override
    public NodeValueElement marshal(String v) throws Exception {
        return new NodeValueElement(v);
    }

    @Override
    public String unmarshal(NodeValueElement v) throws Exception {
        if (v==null) return "";
        return v.getValue();
    }

}

如果您有其他类型的字段,例如 Long 或 Boolean,则必须实现其他(同样简单)的适配器。

还需要一个通用的字段对象来编码:

@XmlAccessorType(XmlAccessType.FIELD)
public class NodeValueElement {

    @XmlAttribute(name="value")
    String value;

    public NodeValueElement() {
    }

    public NodeValueElement(String value) {
        super();
        this.value = value;
    }

    public String getValue() {
        return value;
    }

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

}

要使用适配器,您必须在 POJO 中注释适当的字段:

class Node {
  @XmlJavaTypeAdapter(value=NodeValueStringAttrMarshaller.class)
  String subnode;

  @XmlJavaTypeAdapter(value=NodeValueLongAttrMarshaller.class)
  Long anotherSubNode;
  //...
}

关于java - 将字段编码为具有字段名称的子节点的值属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34720754/

相关文章:

java - 工具栏中的 Android Searchview 在旧版本中不起作用

java - 使用 CXF 和 wsdl2java 生成代码时解决冲突

java - XML 验证 - 已知和未知属性可选吗?

xml - 空字符串是有效的 XML 吗?

android:navigationBarDividerColor 需要 API 级别 28

multithreading - 线程被阻塞 JAXB

java - JAXB 中的 native 查询

java - 如何在字符串中查找 int、大写、小写、空格和数字

java - 从图像中获取手写文本

java - 尝试将 MySQL 服务器连接到 Spring Boot App STS 时出现多个错误