2

私は次のXMLを持っています:

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

これを次のJavaBeanにマーシャリングしています。

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のname要素を使用することです。たとえば、パス「details / detail [1]」を使用するのではなく、「details / detail [name=version]」を使用したいと思います。これは機能せず、org.simpleframework.xml.core.PathExceptionが発生します:パス例外の無効なインデックスが返されました。'で囲んでバージョンを試してみましたが無駄になりました。私がXPathについて理解していることから、これは正しい構文です 。http ://www.w3schools.com/xpath/xpath_syntax.asp 誰かがこれが正しいように見えることを確認できますか?

単純なxmlライブラリのソースコードを調べましたが、サードパーティのライブラリを使用せずにXPath処理を単独で処理しています。数字のみを受け入れ、数字ではない文字に対してその例外をスローするため、なぜ機能しないのかがわかります。

ライブラリを修正したいのですが、何か間違ったことをしているのではないかと思います。また、使用すべき別の注釈やその他の構文がある可能性があります。

私がやろうとしていることを達成するために使用できる別の注釈はありますか?Simpleを使用して私がやろうとしていることを行うことは可能ですか?

4

3 に答える 3

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 に答える
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で使用されているのと同じ名前で変数に名前を付ける必要があります。残念ながら、2つのクラスメンバーが同じ名前(「名前」と「値」)を共有することはできません。 、つまりdetail、XMLにオブジェクトが1つしかない場合を除いて、XPATHを使用することはできません。

于 2013-08-22T06:14:36.407 に答える
0

ちなみに、私はここから入手できる独自のライブラリを作成することでこれを解決しました:https ://github.com/aembleton/XML-Marshaller

非常にシンプルで基本的ですが、当時の問題は解決しました。

于 2014-05-01T22:40:52.517 に答える