2

我有以下 XML:

<rdr>
  <details>
    <detail>
        <name>version</name>
        <value>15.0</value>
    </detail>
    <detail>
        <name>resolution</name>
        <value>1080X1920</value>
    </detail>
  </details>
</rdr>

我将其编组为以下 Java bean:

import org.simpleframework.xml.Element;
import org.simpleframework.xml.Path;
import org.simpleframework.xml.Root;

@Root(name = "rdr", strict = false)
public class XmlBean {

@Path("details/detail[1]")
@Element(name = "value")
private String version;

@Path("details/detail[2]")
@Element(name = "value")
private String resolution;

public String getVersion() {
    return version;
}

public void setVersion(String version) {
    this.version = version;
}

public String getResolution() {
    return resolution;
}

public void setResolution(String resolution) {
    this.resolution = resolution;
}

}

我正在使用简单的 XML,版本 2.6.6 来实现这一点: http ://simple.sourceforge.net/

但是,我想做的是使用 XPath 中的名称元素。例如,我不想使用路径“details/detail[1]”,而是使用“details/detail[name=version]”。这不起作用,我得到一个 org.simpleframework.xml.core.PathException: Invalid index for path exception 返回。我试过用 ' 包围版本无济于事。根据我对 XPath 的理解,这是正确的语法: http ://www.w3schools.com/xpath/xpath_syntax.asp 任何人都可以确认这看起来是正确的吗?

我查看了简单 xml 库的源代码,它自己处理 XPath 处理,而不使用第 3 方库。我可以看到为什么它不起作用,因为它只接受数字并且会为任何不是数字的字符抛出异常。

我很想修复该库,但怀疑我做错了什么,并且可能有另一个我应该使用的注释或其他语法。

是否有另一个注释可以用来实现我想要做的事情?是否可以使用 Simple 来做我想做的事情?

4

3 回答 3

0

使用 SimpleXML 版本:2.6.6。- 在不使用注释的情况下,@Element(name = "value")您可以执行以下操作:

/**
 * User: alfasin
 * Date: 8/21/13
 */

import org.simpleframework.xml.Element;
import org.simpleframework.xml.Path;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;

import java.io.File;

@Root(name = "rdr", strict = false)
public class SimpleXml {
    @Element
    @Path("details/detail[1]")
    private String name;

    @Element
    @Path("details/detail[1]")
    private String value;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public static void main(String...args) throws Exception {
        String fileName = "C:\\Users\\Nir\\IdeaProjects\\Play\\rdr.xml";
        Serializer serializer = new Persister();
        File source = new File(fileName);

        SimpleXml example = serializer.read(SimpleXml.class, source);
        System.out.println(example.getName());
        System.out.println(example.getValue());
    }

}

输出:

version
15.0

但是,根据文档,使用 XPATH 要求您将变量命名为与 XML 中使用的名称相同的名称,唉,您不能让两个类成员共享相同的名称(“名称和值”) ,这意味着您不能使用 XPATH,除非您detail在 XML 中只有一个对象。

于 2013-08-22T06:14:36.407 回答
0

顺便说一句,我通过编写自己的库来解决这个问题:https ://github.com/aembleton/XML-Marshaller

它非常简单和基本,但当时解决了问题。

于 2014-05-01T22:40:52.517 回答
0

这就是它在 xpath 中的样子:/rdr/details/detail[name='version']/value/text()

所以也许尝试:

@Path("details/detail[name='version']")
@Element(name = "value")
private String resolution;

看到''它需要知道这是文本

于 2012-09-06T14:10:43.283 回答