java - 在Java Xstream中如何更改对象内的别名?

标签 java xml xstream

我正在使用 xStream 将一个非常简单的图形序列化为 XML,我的输出与我想要的非常接近:

<grafo>
  <nodo id="1">
   <nodo id="2"/>
  </nodo>
  <nodo id="2">
    <nodo id="3"/>
    <nodo id="4"/>
  </nodo>
  <nodo id="3">
    <nodo id="5"/>
  </nodo>
  <nodo id="4">
    <nodo id="6"/>
  </nodo>
 </grafo>

但我需要在输出中另一个节点(边缘)内的每个节点都以别名“child”出现,而不是“nodo”。

最佳答案

我不相信你可以用简单的别名来做到这一点。但您可以使用自定义序列化器来完成此操作,如下所示。 xstream 文档有一个很好的 converter tutorial其中包括有关如何注册自定义转换器的详细信息。

public class Nodo {
  String id;
  ArrayList<Nodo> children = new ArrayList<>();
}

public class NodoConverter implements Converter {


  /** {@inheritDoc} */
  @Override
  public boolean canConvert(Class arg0) {
    return arg0.equals(Nodo.class);
  }

  /** {@inheritDoc} */
  @Override
  public void marshal(Object arg0, HierarchicalStreamWriter writer, MarshallingContext arg2) {
    marshal((Nodo) arg0, writer, arg2, "nodo");
  }

  private void marshal(Nodo nodo, HierarchicalStreamWriter writer, MarshallingContext ctx, String elname) {
    writer.addAttribute("id", nodo.getId());
    for (Nodo child : nodo.children) {
      writer.startNode("child");
      ctx.convertAnother(child);
      writer.endNode();
    }
  }

  /** {@inheritDoc} */
  @Override
  public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext ctx) {
    Nodo nodo = new Nodo();
    nodo.setId(reader.getAttribute("id"));
    while (reader.hasMoreChildren()) {
      reader.moveDown();
      Nodo child = (Nodo) ctx.convertAnother(nodo, Nodo.class);
      nodo.children.add(child);
      reader.moveUp();
    }
  }

}

关于java - 在Java Xstream中如何更改对象内的别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13079000/

相关文章:

java - 什么是NullPointerException,我该如何解决?

spring - 如何使用命名空间前缀将 POJO 序列化为 xml

java - 使用 xStream 序列化 BiMap

java - 为 ZonedDateTime 编写 xstream 转换器

java - 如何从 ArrayList 中删除仅包含空白字符的字符串?

java - 如何在 RoboVM 中检查手机是否正在充电?

java - 如何在 Android 中运行 cUrl 调用?

python xml xpath查询使用带有ns的标签和属性

xml - RedHat Enterprise 5 上的 Tomcat servlet 问题

Python 元素树 : Ignore undefined prefixes