【问题标题】:XStream and parse xml attributesXStream 和解析 xml 属性
【发布时间】:2016-03-16 08:33:00
【问题描述】:

我有一些看起来像这样的 xml:

<document>
    <item name="id">some value</item>
    <item name="first-name">some value</item>
    <item name="last-name">some value</item>
    <item name="address">some value</item>
    <item name="zip">some value</item>
</document>

POJO:

@XStreamAlias("document")
public class Doc{
    private String id;
    private String firstName;
    private String lastName;
    private String address;
    private String zip;
}

编辑:

我面临的问题是有重复的 &lt;item&gt; 标签导致 xstream 抛出异常。我正在寻找一种从item 元素中提取idfirst-namelast-name 等属性的方法

【问题讨论】:

    标签: java xml xstream


    【解决方案1】:

    您需要根据提供的 XML 更改类的结构:

    文档:

    @XStreamAlias("document")
    public class Document {
        @XStreamConverter(value = ItemsConverter.class)
        private Items items;
    }
    

    项目:

    public class Items {
        private String id;
        private String firstName;
        private String lastName;
        private String address;
        private String zip;
    
        public void setId(String id) {
            this.id = id;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public void setZip(String zip) {
            this.zip = zip;
        }
    }
    

    提供一个自定义转换器(ItemsConverter),它将所有&lt;item&gt;标签转换为Items对象中的字段。

    自定义转换器:

    import com.thoughtworks.xstream.converters.Converter;
    import com.thoughtworks.xstream.converters.MarshallingContext;
    import com.thoughtworks.xstream.converters.UnmarshallingContext;
    import com.thoughtworks.xstream.io.HierarchicalStreamReader;
    import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
    
    public class ItemsConverter implements Converter {
    
    
        @Override
        public void marshal(Object o, HierarchicalStreamWriter hierarchicalStreamWriter, MarshallingContext marshallingContext) {
            // implement logic for marshalling to xml
        }
    
        @Override
        public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader, UnmarshallingContext unmarshallingContext) {
            Items items = new Items();
            while (hierarchicalStreamReader.hasMoreChildren()) {
                hierarchicalStreamReader.moveDown();
                final String currentAttribute = hierarchicalStreamReader.getAttribute("name");
                if ("id".equals(currentAttribute)) {
                    items.setId(hierarchicalStreamReader.getValue());
                } else if ("first-name".equals(currentAttribute)) {
                    items.setFirstName(hierarchicalStreamReader.getValue());
                } else if ("last-name".equals(currentAttribute)) {
                    items.setLastName(hierarchicalStreamReader.getValue());
                } else if ("address".equals(currentAttribute)) {
                    items.setAddress(hierarchicalStreamReader.getValue());
                } else if ("zip".equals(currentAttribute)) {
                    items.setZip(hierarchicalStreamReader.getValue());
                }
                hierarchicalStreamReader.moveUp();
            }
            return items;
        }
    
        @Override
        public boolean canConvert(Class aClass) {
            return aClass == Items.class;
        }
    }
    

    测试类:

    public class XStreamTest {
    
        public static void main(String[] args){
            XStream stream = new XStream();
            stream.processAnnotations(Document.class);
            Document document = (Document)stream.fromXML(new InputStreamReader(XStreamTest.class.getResourceAsStream(<your file name>)));
        }
    }
    

    【讨论】:

    • 我已经修改了我的问题。问题在于从重复元素标签中提取属性
    • 当我只想要address 属性时会发生什么?比如说我不关心这个人的任何其他事情,除了他们的地址。我是否必须遍历所有 items 并应用条件逻辑?
    • 要只获取特定属性而不迭代所有项目,您需要为项目字段编写自定义转换器。查看自定义转换器的答案
    • 感谢 akki 的一个很好的例子。只是为了 100% 清楚,没有其他方法可以在不返回 Map 的情况下获取属性?我希望我可以使用 xml 属性填充 POJO,但使用 xstream 似乎不可能。
    • 有一种可能性,但转换器将非常特定于您的 xml 文档结构。我在答案中添加了这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多