Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XStream:XStream 1.3.1中具有属性的节点和文本节点?_Java_Xml_Xstream - Fatal编程技术网

Java XStream:XStream 1.3.1中具有属性的节点和文本节点?

Java XStream:XStream 1.3.1中具有属性的节点和文本节点?,java,xml,xstream,Java,Xml,Xstream,我想用XStream将一个对象序列化为这种形式的XML <node att="value">text</node> 它以一种简单的方式实现了我想要的功能,但在XStream 1.3.1中不可用 对于XStream的1.3.1版本,有没有更好的方法来解决这个问题?一些黑客可能会这样做。主要的idia是使用1.4.7中修改的到attributedValueConverter 将复制到AttributedValueConverter到您的软件包中 将useAttributeF

我想用XStream将一个对象序列化为这种形式的XML

<node att="value">text</node>
它以一种简单的方式实现了我想要的功能,但在XStream 1.3.1中不可用


对于XStream的1.3.1版本,有没有更好的方法来解决这个问题?

一些黑客可能会这样做。主要的idia是使用1.4.7中修改的
到attributedValueConverter

  • 复制到AttributedValueConverter
    到您的软件包中
  • useAttributeForEnumApper
    复制到您的软件包中
  • 替换为赋值转换器#字段相等
    ,如下所示:

    private boolean fieldIsEqual(FastField field) {
        return valueField.getName().equals(field.getName())
                && valueField.getDeclaringClass().getName()
                        .equals(field.getDeclaringClass().getName());
    }
    
    public UseAttributeForEnumMapper(Mapper wrapped) {
        super(wrapped, null);
    }
    
  • useAttributeForEnumApper
    中替换构造函数,如下所示:

    private boolean fieldIsEqual(FastField field) {
        return valueField.getName().equals(field.getName())
                && valueField.getDeclaringClass().getName()
                        .equals(field.getDeclaringClass().getName());
    }
    
    public UseAttributeForEnumMapper(Mapper wrapped) {
        super(wrapped, null);
    }
    
  • 无法使用
    @XStreamConverter
    注释,因为
    ToAttributedValueConverter
    具有需要一些额外信息的构造函数,如值字段。但是您可以交替使用
    XStream#registerConverter
    。所以你的班级必须看起来像:

        @XStreamAlias("node")
        public class Node {
            private String attr;
            private String content;
    
            public void setAttr(String attr) { this.attr = attr; }
            public String getAttr() { return attr; }
            public void setContent(String content) { this.content = content; }
            public String getContent() { return content; }
        }
    
    下面是一个示例,演示如何为此转换器配置xstream:

        public static void main(String[] args) {
            final Node node = new Node();
            node.setAttr("value");
            node.setContent("text");
    
            final XStream xstream = new XStream();
            configureXStream(xstream);
    
            final String xml = xstream.toXML(node);
            System.out.println(xml);
    
            final Node node2 = (Node) xstream.fromXML(xml);
            System.out.println("attr: " + node2.getAttr());
            System.out.println("content: " + node2.getContent());
        }
    
        private static void configureXStream(final XStream xstream) {
            xstream.autodetectAnnotations(true);
            final Mapper mapper = xstream.getMapper();
            final ReflectionProvider reflectionProvider = xstream
                    .getReflectionProvider();
            final ConverterLookup lookup = xstream.getConverterLookup();
            final Converter converter = new ToAttributedValueConverter(Node.class,
                    mapper, reflectionProvider, lookup, "content");
            xstream.registerConverter(converter);
        }
    
    此程序打印出:

        <node attr="value">text</node>
        attr: value
        content: text
    
    文本
    属性:值
    内容:文本