2017-09-11 35 views
0

我用java 的XPathFactory從一個簡單的XML文件中獲取值:的Java的XPath列表concatination

<Obama> 
    <coolnessId>0</coolnessId> 
    <cars>0</cars> 
    <cars>1</cars> 
    <cars>2</cars> 
</Obama> 

隨着上的表達//Obama/coolnessId | //Obama/cars結果是:

0 
0 
1 
2 

從這個結果,我無法區分什麼是coolnessId和什麼是汽車id。我需要這樣的東西:

CoolnessId: 0 
CarId: 0 
CarId: 1 
CarId: 2 

隨着concat('c_id: ', //Obama/coolnessId,' car_id: ',//Obama/cars)我靠近的解決方案,但CONCAT不能用於值的列表。 不幸的是,我不能使用字符串連接,因爲它似乎不在我的xpath庫中知道。我不能操縱給定的XML。

我還可以使用其他什麼技巧來獲取類似別名的值列表?

+0

[使用XPath/XQuery獲取元素名稱]的可能重複(https://stackoverflow.com/questions/11121089/getting-element-names-using-xpath-xquery) – DMC19

+0

如果您需要區分兩者之間的區別,爲什麼只使用一條路徑? – daniu

回答

1

如果選擇的元素,而不是其文本內容你就會有一些背景:

public static void main(String[] args) throws Exception { 

    String xml = 
     "<Obama>" + 
     " <coolnessId>0</coolnessId>" + 
     " <cars>0</cars>" + 
     " <cars>1</cars>" + 
     " <cars>2</cars>" + 
     "</Obama>"; 

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    factory.setNamespaceAware(true); 

    Document doc = factory.newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))); 
    XPath xpath = XPathFactory.newInstance().newXPath(); 

    XPathExpression expr = xpath.compile("//Obama/cars | //Obama/coolnessId"); 
    NodeList result = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 
    for (int i = 0; i < result.getLength(); i++) { 
     Element item = (Element) result.item(i); 
     System.out.println(item.getTagName() + ": " + item.getTextContent()); 
    } 
} 
1

假設你索要評價爲節點列表中的結果,您的XPath表達式實際返回的四個序列元素節點,而不是您建議的四個字符串序列。如果您的輸入使用DOM樹模型,則這些將以DOM NodeList的形式返回。您可以處理此NodeList中的Node對象以獲取節點的名稱以及它們的字符串值。

string-join((//Obama/coolnessId | //Obama/cars) ! (name() || ': ' || string()), '\n') 

爲了在撒克遜調用XPath表達式可以使用任一JAXP:

如果切換到一個XPath 3.1發動機如撒克遜,則可以直接使用XPath表達式得到的結果作爲單個字符串API(javax.xml.xpath)或Saxon的s9api接口:我會推薦s9api,因爲它理解XPath 2.0及更高版本的更豐富的類型系統。