【问题标题】:Intercepting Xstream while parsing XML在解析 XML 时拦截 Xstream
【发布时间】:2011-06-05 02:30:09
【问题描述】:

假设我有一个像这样的简单 Java 类:

public class User {

    String firstName;
    String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

}

现在,假设我要解析以下 XML:

<user>
    <firstName>Homer</firstName>
    <lastName>Simpson</lastName>
</user>

我可以像这样在 XStream 中毫无问题地做到这一点:

User homer = (User) xstream.fromXML(xml);

好的,到目前为止一切都很好,但这是我的问题。

假设我有以下要解析的 XML:

<user>
    <fullName>Homer Simpson</fullName>
</user>

如何使用 XStream 将此 XML 转换为 相同 用户对象?

我想要一种实现某种回调的方法,这样当 XStream 解析 fullName 字段时,我可以将字符串一分为二,并在用户对象上手动设置名字和姓氏字段。这可能吗?

请注意,我不是在问如何将字符串一分为二(这是最简单的部分),我想知道如何拦截 XML 解析,因此 XStream 不会尝试反射性地设置 User 对象上的 fullName 字段(显然不存在)。

我查看了 XStream 提供的转换器,但不知道如何将其用于此目的。

任何帮助将不胜感激。

【问题讨论】:

    标签: java xml xstream


    【解决方案1】:

    您需要一个自定义转换器:

    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 UserConverter implements Converter
    {
    
        @Override
        public boolean canConvert(Class clazz) {
            return clazz.equals(User.class);
        }
    
        @Override
        public void marshal(Object value, HierarchicalStreamWriter writer,
                MarshallingContext context) 
        {
    
        }
    
        @Override
        public Object unmarshal(HierarchicalStreamReader reader,
                UnmarshallingContext context) 
        {
            User user = new User();
    
            reader.moveDown();
            if ("fullName".equals(reader.getNodeName()))
            {
                String[] name = reader.getValue().split("\\s");
                user.setFirstName(name[0]);
                user.setLastName(name[1]);
            }
            reader.moveUp();
    
            return user;
        }
    }
    

    参考:http://x-stream.github.io/converter-tutorial.html

    【讨论】:

    • 谢谢,我最终使用自定义转换器实现了与您类似的解决方案。
    猜你喜欢
    • 2011-09-19
    • 2016-03-16
    • 1970-01-01
    • 2011-01-03
    • 2023-04-04
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多