2012-09-06 30 views
2

我有以下XML:如何在Java SimpleXML庫中設置路徑時使用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:返回路徑異常的索引無效。我嘗試過使用「無效」的版本。從我所瞭解的XPath中,這是正確的語法:http://www.w3schools.com/xpath/xpath_syntax.asp任何人都可以確認這看起來正確嗎?

我已經查看了簡單xml庫的源代碼,並且它正在處理XPath處理而不使用第三方庫。我可以看到它爲什麼不起作用,因爲它只接受數字,並且會拋出任何不是數字的字符的異常。

我很想修復這個庫,但懷疑我做錯了什麼,並且可能會有另一個註釋,我應該使用或者其他一些語法。

是否有另一個註釋,我可以用來實現我想要做的?是否有可能做我想用Simple做的事情?

回答

0

這是它會怎樣看在的XPath:/ RDR /信息/細節[名稱= '版本'] /價值/文()

所以也許嘗試:

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

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

+1

我已經試過了,而且我得到了同樣的錯誤。就像我剛纔提到的,我知道爲什麼這是通過查看源代碼。 SimpleXML正在尋找並接受一個數字。其他任何事情都會導致拋出PathException。 我想知道是否有與SimpleXML使用不同的語法,或者是否有另一個我可以使用的註釋。 – Arthur

+0

沒有ü嘗試的東西,如:名稱= 「版本」 或轉義字符,如:名稱= \ '版本\' 或名稱= \ 「版本的\」 –

+0

看看這個:公共的OrderManager(@ElementList(NAME = 「訂單」)列表訂單){ this.orders =訂單; }從這裏它:http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php所以也許雙QUOT將工作 –

0

使用SimpleXML ver: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()); 
    } 

} 

OUTPUT:

version 
15.0 

然而,根據the documentation,使用XPATH要求您將其命名具有相同名稱的變量在XML中使用,唉,您不能讓兩個類成員共享相同的名稱(「名稱」和「值」),這意味着除非在XML中只有一個detail對象,否則不能使用XPATH。