2013-01-25 25 views
1

不同的路徑檢索多個值,這是我的XML的XPath - 基於相同的條件下

<root> 
    <entry id="1"> 
     <value name="ID">11</value> 
     <value name="ENABLE">0</value> 
     <value name="NAME">USER1</value> 
    </entry> 
    <entry id="2"> 
     <value name="ID">11</value> 
     <value name="ENABLE">0</value> 
     <value name="NAME">USER2</value> 
    </entry> 
    <entry id="3"> 
     <value name="ID">12</value> 
     <value name="ENABLE">0</value> 
     <value name="NAME">USER1</value> 
    </entry> 
</root> 

我需要一個XPath查詢檢索所有其id是名稱。

我想:

String xpath = "/root/entry/value[@name=ID/text()='11']/value[@name='NAME']"; 
String xpath = "/root/entry/value[@name=ID/text()='11']/NAME"; 

有人能告訴我什麼是錯誤的,我查詢?

編輯:

預期輸出:

USER1 
USER2 

這兩個具有ID = 11

+0

請詳細說明預期的輸出示例。返回所有「姓名」是什麼意思? – OldProgrammer

+0

我的預期輸出是USER1和USER2,因爲兩者都有ID = 11 – Abi

+0

請查看我的帖子,瞭解訪問所有匹配節點所需的Java代碼,而不是第一個。 – JLRishe

回答

0

這將是正確的路徑:

/root/entry[value[@name = 'ID'] = 11]/value[@name = 'NAME'] 

要檢索的節點列表,你需要使用xPath.evaluate(版本),需要一個返回類型參數:

InputSource document = new InputSource(new FileInputStream("user1.xml")); 
String xpath = "/root/entry[value[@name = 'ID'] = 11]/value[@name = 'NAME']"; 
NodeSet result = (NodeSet)xPath.evaluate(xpath, document, XPathConstants.NODESET); 
for(int index = 0; index < result.getLength(); index ++) {  
    Node node = result.item(index); 
    String name = node.getNodeValue(); 
} 
+0

這是個例外 – Abi

+0

@Abi對不起,我有一個額外的斜槓。請現在試試。 – JLRishe

+0

非常感謝,即使我現在正在工作。 – Abi

0

嘗試此,

字符串的xpath =「/根/條目[值@ name ='ID'和text()='11']]/value [@ name =「NAME」]「;

+0

不,我得到11作爲輸出 – Abi

+0

我缺少名稱部分,現在檢查 – jeewiya

+0

我只得到一個用戶值返回 – Abi

3
/root/entry[value[@name="ID" and .=11]]/value[@name="NAME"] 

/root/entry/value[@name="ID" and .=11]/../value[@name="NAME"] 

/descendant::entry[value=11 and value/@name="ID"]/value[@name="NAME"] 

//value[.=11]/@name[.="ID"]/ancestor::entry/value[@name="NAME"] 

或許多其它的變化

+0

第一個選項 - 無限循環。第二選項 - 只返回一個用戶USER1 – Abi

+0

第四選項也只返回一個值 – Abi

1

使用

/*/*[*[@name='ID'] = 11]/*[@name='NAME'] 

XSLT - 基於驗證

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="/*/*[*[@name='ID'] = 11]/*[@name='NAME']"/> 
</xsl:template> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔施加:

<root> 
    <entry id="1"> 
     <value name="ID">11</value> 
     <value name="ENABLE">0</value> 
     <value name="NAME">USER1</value> 
    </entry> 
    <entry id="2"> 
     <value name="ID">11</value> 
     <value name="ENABLE">0</value> 
     <value name="NAME">USER2</value> 
    </entry> 
    <entry id="3"> 
     <value name="ID">12</value> 
     <value name="ENABLE">0</value> 
     <value name="NAME">USER1</value> 
    </entry> 
</root> 

XPath表達式求值和該評價(所有選定節點)被複制到輸出的結果:

<value name="NAME">USER1</value> 
<value name="NAME">USER2</value> 
+0

謝謝,這是工作,但是XSL是唯一的方式去呢?不能用普通的XPath完成?因爲當我在我的班級中使用Xpath時,它只返回user1 – Abi

+1

@Abi Dimitre的例子和我的應該找到USER1和USER2。如果您只獲得一個值,那麼您應用XPath的方式就是錯誤的。請向我們展示您的實際代碼。 – JLRishe

+0

@JLRishe - 是的,這可能是錯誤,代碼是\t \t \t String xpath =「/ root/entry [value [@name ='ID'] = 11]/value [@name ='NAME']」; \t \t \t \t \t \t字符串結果= \t xPath.evaluate(XPath中,新的InputSource(新的FileInputStream( 「user1.xml」))); – Abi

0

用途:

//entry[value[@name = 'ID'] = 11]/value[@name = 'NAME']