当前位置: 首页 > 知识库问答 >
问题:

XStream:带属性的节点和XStream 1.3.1中的文本节点?

黎浩然
2023-03-14

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

<node att="value">text</node>

在StackOverflow中已经有一个解决方案:XStream:node with attributes and text node?但它对我不起作用,因为我只能使用XStream1.3.1。

@XStreamConverter(value=ToAttributedValueConverter.class, strings={"content"}) 

共有1个答案

习斌
2023-03-14

通过一些黑客是有可能的。主要的idia是使用1.4.7中修改的ToAttributedValueConverter

>

  • ToAttributedValueConverter复制到包中
  • UseAttributeForenumMapper复制到包中
  • 替换为ToAttributedValueConverter#Fieldisequal如下所示:

    private boolean fieldIsEqual(FastField field) {
        return valueField.getName().equals(field.getName())
                && valueField.getDeclaringClass().getName()
                        .equals(field.getDeclaringClass().getName());
    }
    

    替换UseAttributeForenumMapper中的构造函数,如下所示:

    public UseAttributeForEnumMapper(Mapper wrapped) {
        super(wrapped, null);
    }
    
        @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; }
        }
    
        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
    

  •  类似资料:
    • 问题内容: 我想使用XStream将对象序列化为这种形式的XML。 节点( 文本 )的值是序列化对象以及 att 属性上的字段。无需为此对象编写转换器就可以吗? 谢谢! 问题答案: 写一个转换器,应该类似于代码片段 在使用XStream时,注册转换器

    • 我正在将XML返回到一个jsp页面。 最终的XML结构如下所示: 的根节点作为向量返回,我使用xtream将其别名为“tasks”,如上图所示。 如何使用XStream实现这一点?我需要使用XSLT文件来转换XML输出吗?完成这一点的最佳方法是什么?

    • 无法完成这项理论上相对简单的任务: 查找节点文档,其中Field具有包含特定文本的属性Name,并且子节点Option具有值。 XML: 所以我希望能够将模板应用到文档中,比如 但那是行不通的。 只需指定:文档必须在选项中包含文本,该选项是包含特定文本的字段的子节点。 在xml中,使用输入值: 1:Børn Fridslip= 2: Børn-Fritidsklub= 3:Børn Fritid=

    • 我已经掌握了XPath的基本知识,但在确定以下内容是否可以在使用XPath的C代码中实现时遇到了一些困难(或者我是否需要将其转移到其他代码中,正如我目前所做的那样)。 我有一个XML文档,它由以下结构组成: 其中有多个设置参数值。现在我需要做的只是检索那些包含name属性某些值的setParameter节点。我可能有这些值的可能匹配列表,但它们不会是完全匹配,它们将是节点的name属性必须包含的值

    • 我一直在用PHP的SimpleXMLIterator处理XML数据。 在迭代一个子树(

    • 对于下面的XML,我正在尝试根据属性和节点值提取节点。 基于属性class=pass和h1包含('objectives'),我试图提取以下输出。 “目标”是节点值字符串“1任务目标”的一部分 1任务目标1目标2 下面是我正在尝试的XPath表达式。然而,这并没有产生任何输出。你能指出我做错了什么吗? 谢谢