2016-02-29 61 views
0

舉個例子價值,這是一種XML文件,我有:查詢在XML文件中選擇從節點

<Node> 
    <Sample A> 
     ... 
    </Sample A> 
    <Sample B> 
     <myType>importantValue</myType> 
    </Sample B> 
    ... 
    <Sample Z> 
     <myValue>16</myValue> 
    </Sample Z> 
<Node> 
    <Sample A> 
     ... 
    </Sample A> 
    <Sample B> 
     <myType>importantValue</myType> 
    </Sample B> 
    ... 
    <Sample Z> 
     <myValue>16</myValue> 
    </Sample Z> 

如何使類似的查詢以「選擇的myType和myvalue的地方myvalue的> X 「?

我想使用xPath來找到正確的元素,我相信有一個簡單的方法來做到這一點,但由於我是新來的XML查詢我不找到一種簡單的方法..在此先感謝!

+0

你到目前爲止做了什麼?一個完整的,可執行的代碼片段將是好的 – ThoFin

+0

String expression =「/ Node/SampleB/myType String type = xPath.compile(expression).evaluate(doc); 但是我不知道如何獲取節點元素..?和它的孩子..? – Malin

+0

你能在這裏發佈你的代碼嗎? – FallAndLearn

回答

0

以下是步驟。希望你沒有錯過它們。

從文件或流

StringBuilder xmlStringBuilder = new StringBuilder(); 
xmlStringBuilder.append("<?xml version="1.0"?> <class> </class>"); 
ByteArrayInputStream input = new ByteArrayInputStream(
    xmlStringBuilder.toString().getBytes("UTF-8")); 
Document doc = builder.parse(input); 

構建的XPath

XPath xPath = XPathFactory.newInstance().newXPath(); 

準備路徑表達式創建文檔並對其進行評估

String expression = "/Node/SampleB";    
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET); 

遍歷節點列表

for (int i = 0; i < nodeList.getLength(); i++) { 
    Node nNode = nodeList.item(i); 
    ... 
} 

檢查屬性

//returns specific attribute 
getAttribute("attributeName"); 
//returns a Map (table) of names/values 
getAttributes(); 

檢查子元素

//returns a list of subelements of specified name 
getElementsByTagName("subelementName"); 
//returns a list of all child nodes 
getChildNodes(); 

在你的情況,

String expression = "/Node/SampleB"; 
for (int i = 0; i < nodeList.getLength(); i++) { 
      Node nNode = nodeList.item(i); 
      System.out.println("\nCurrent Element :" + nNode.getNodeName()); 
      if (nNode.getNodeType() == Node.ELEMENT_NODE) { 
       Element eElement = (Element) nNode; 
       System.out.println(eElement.getElementsByTagName("myType") 
        .item(0).getTextContent());}} 
+0

我可以做類似 String expression =「/ Node」; NodeList nodeList =(NodeList)xPath.compile(expressi on).evaluate(doc,XPathConstants.NODESET); nodeList.getElementsByTagName(「SampleB」)。getAttribute(「myType」); ? – Malin

+0

在結尾處查看我添加的代碼段。 – FallAndLearn

+0

現在工作嗎? – FallAndLearn

0

假設你的XML的結構是這樣的:

<Node> 
    <Sample> 
    <someValue>sharks</someValue> 
    </Sample> 
    <Sample> 
    <myValue>16</myValue> 
    </Sample> 
    <Sample> 
    <myType>importantValue</myType> 
    </Sample> 
</Node> 
<Node> 
    ... 
</Node> 
... 

而且SamplesNode元素進行分組,然後你想要的是找到一個特定的Node你想要的屬性,然後找到值從你想要的相同Node

這裏是一個XPath表達式得到了Node通過Sample/myValue

//Node[Sample/myValue = '16'] 

該讀作「讓所有Nodes其子Sample的孩子myValue的價值是'16'」。

您可以添加到它來獲得不同的值:

//Node[Sample/myValue = '16']/Sample/myType 

這改變了XPath表達式的返回值,它讀作「得到myType值,其母公司是Sample,其母公司是NodeSample/myValue的值是'16'「。

要獲得多個值了XPath表達式,你可以使用|運營商多個表達式組合在一起:

//Node[Sample/myValue = '16'] | //Node[Sample/myValue = '15'] 

該讀作「讓所有NodesSample/myValue值爲'16''15'」。