【问题标题】:Customizing XStream output自定义 XStream 输出
【发布时间】:2011-04-13 01:40:27
【问题描述】:

我有一个类似于这样的类:

class foo {
    List<String> bar;
    ...
}

我在列表中添加了四个字符串bar

bar.add("1");
bar.add("2");
bar.add("3");
bar.add("4");

使用 xstream,我设法获得如下所示的输出:

<foo>
  <bar>
     <blah>1</blah>
     <blah>2</blah>
     <blah>3</blah>
     <blah>4</blah>
  </bar>
</foo>

但是,我需要如下所示的 XML:

<foo>
  <bar>
     <blah id="1"/>
     <blah id="2"/>
     <blah id="3"/>
     <blah id="4"/>
     ...
  </bar>
</foo>

谁能帮我解决这个问题?

【问题讨论】:

    标签: xml collections xml-serialization converter xstream


    【解决方案1】:

    您可以通过执行以下操作获得所需的输出:

    1:创建 Blah 类,除非您希望所有字符串都显示为属性。

    @XStreamAlias("blah")
    public class Blah {
        @XStreamAsAttribute
        String id;
    
        Blah(){};
    
        Blah(String s) {
        this.id = s;
        }
    }
    

    2:你的 foo 有一堆废话

    @XStreamAlias("foo")
    public class Foo {
        List<Blah> bar = new ArrayList<Blah>();
    } 
    

    3:告诉 XStream 处理注释

    XStream xstream = new XStream();
    xstream.processAnnotations(Foo.class);
    xstream.processAnnotations(Blah.class);
    System.out.println(xstream.toXML(f));
    

    4:这是输出:

    <foo>
      <bar>
        <blah id="1"/>
        <blah id="2"/>
        <blah id="3"/>
        <blah id="4"/>
      </bar>
    </foo>
    

    【讨论】:

    • 感谢您向我展示了这种处理 xstream 的方式。我不知道它支持注释。我也试试这个方法。
    【解决方案2】:

    如果 XStream 不支持,可以使用MOXy JAXB 来完成。您将需要使用 @XmlPath 注释:

    import java.util.List;
    import javax.xml.bind.annotation.*;
    import org.eclipse.persistence.oxm.annotations.XmlPath;
    
    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    class Foo {
        @XmlPath("bar/blah/@id")
        List<String> bar; 
    }
    

    您可以生成以下 XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <foo>
       <bar>
          <blah id="1"/>
          <blah id="2"/>
          <blah id="3"/>
          <blah id="4"/>
       </bar>
    </foo>
    

    使用此演示代码:

    import java.util.ArrayList;
    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(Foo.class);
    
            Foo foo = new Foo();
            foo.bar = new ArrayList<String>();
            foo.bar.add("1"); 
            foo.bar.add("2"); 
            foo.bar.add("3"); 
            foo.bar.add("4"); 
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(foo, System.out);
        }
    }
    

    欲了解更多信息,请参阅:

    【讨论】:

    • 感谢您的回答。我确实设法通过 XStream CollectionConverter 获得了我想要的输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多