【问题标题】:How can I make implicit to node which is not collection?如何隐含到不是集合的节点?
【发布时间】:2026-02-04 18:05:01
【问题描述】:

我想把这个类转换成这种类型的 xml 文件。我应该怎么做才能删除节点<с>?如何对不是集合的节点进行隐式处理?

Java:

public class root {
    int a;
    int b;
    int d;
}

XML:

<root>
  <a>123</a>
  <b>345</b>
  <c>
     <d>567</d>
  </c>
</root>

【问题讨论】:

  • 我看不到您的 Java 类将如何生成此 XML。您想要拥有c 元素吗?或者是否你想拥有它?为什么d
  • &lt;c&gt; 是如何进入您的 XML 的?这是一个谜。

标签: java xml xstream


【解决方案1】:

您可以尝试使用 Converter。 创建一个实现 com.thoughtworks.xstream.converters.Converter 的类,并覆盖它的 marshal 和 unmarshal 方法:添加一个丑陋的例子来达到目的。

class SimpleConverter implements Converter{
@Override
    public void marshal(Object o, HierarchicalStreamWriter writer, MarshallingContext marshallingContext) {
        Root i = (Root) o;
        writer.startNode("a");
        writer.setValue(String.valueOf(i.a));
        writer.endNode();
        writer.startNode("b");
        writer.setValue(String.valueOf(i.b));
        writer.endNode();
        writer.startNode("c");
        writer.startNode("d");
        writer.setValue(String.valueOf(i.d));
        writer.endNode();
        writer.endNode();

    }
@Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext unmarshallingContext) {
        Root root = new Root();
        reader.moveDown();
        root.a = Integer.valueOf(reader.getValue());
        reader.moveUp();
        reader.moveDown();
        root.b = Integer.valueOf(reader.getValue());
        reader.moveUp();
        reader.moveDown();
        reader.moveDown();
        root.d = Integer.valueOf(reader.getValue());
        reader.moveUp();
        reader.moveUp();
        return root;
    }
    @Override
    public boolean canConvert(Class aClass) {
        return aClass.equals(Root.class);
    }
}

class Root {
    public int a;
    public int b;
    public int d;
}

像这样使用它:

        Root root = new Root();
        root.a = 1;
        root.b = 2;
        root.d = 3;
        XStream xStream = new XStream();
        xStream.registerConverter(new SimpleConverter());
        System.out.println(xStream.toXML(root));
        Root root1 = (Root) xStream.fromXML(xStream.toXML(root));

【讨论】:

    最近更新 更多