2016-09-26 77 views
1

我需要知道我的邏輯是否正確,因爲我是新來玩XML節點的。 這是我的代碼。 JAVA通過在java中搜索從xml節點獲取值

 try{ 
     File inputFile = new File("C:\\Users\\luenwong\\Desktop\\decoded.txt"); 
     Scanner scanner = new Scanner(new File("C:\\Users\\luenwong\\Desktop\\decoded.txt")); 
     String text = scanner.useDelimiter("\\A").next(); 
     scanner.close(); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document docum = dBuilder.parse(inputFile); 
     docum.getDocumentElement().normalize(); 
     NodeList nList = docum.getElementsByTagName("row"); 
     System.out.println("------------------------------"); 
     for(int temp=0; temp<nList.getLength();temp++){ 
      Node nNode = nList.item(temp); 
      System.out.println("\n Current Element :" + nNode.getNodeName()); 
      if(nNode.getNodeType() == Node.ELEMENT_NODE){ 
       Element eElement = (Element) nNode; 
       String here = eElement.getElementsByTagName("col").item(1).getTextContent(); 
        if(here.indexOf("AB02") == 0) 
        { 
//     InputStream is = new ByteArrayInputStream(text.getBytes()); 
//     Document doc = PositionalXMLReader.readXML(is); 
//     Node test = doc.getElementsByTagName("col").item(0); 
//     System.out.println("Student roll no : " + eElement.getElementsByTagName("col").item(0).getTextContent()); 
//     System.out.println("Line number: " + test.getUserData("lineNumber")); 
        } 
       } 
      } 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 

我的XML文件

<?xml version="1.0" encoding="UTF-8"?> 
<mapping-table> 
<col-def name="Location Description" type="nocase"/> 
<col-def name="Centre Code" type="nocase"/> 
<col-def name="Location Code" type="nocase"/> 
<col-def name="Status" type="nocase"/> 
<row> 
    <col>TAMAN TUN DR ISMAIL</col> 
    <col>AB02</col> 
    <col>CSTDI</col> 
    <col>active</col> 
</row> 
<row> 
    <col>KUALA LUMPUR CITY CENTRE (KLCC)</col> 
    <col>AA02</col> 
    <col>I-CTRKLCC</col> 
    <col>active</col> 
</row> 
</mapping-table> 

我所試圖做的是我希望鍵入「AA02」,我能得到的結果爲「吉隆坡城市中心(KLCC) 」。 我的邏輯是,我會查找行號,然後使用行號爲-1來獲得結果。但我不知道它是否能夠通過使用行號找到xml節點。

回答

2

您應該使用XPath相反,你的代碼會那麼簡單得多閱讀和維護

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document docum = dBuilder.parse(inputFile); 

XPathFactory xPathfactory = XPathFactory.newInstance(); 
XPath xpath = xPathfactory.newXPath(); 
String codeToFind = "AA02"; 
XPathExpression expr = xpath.compile(
    String.format("/mapping-table/row[col='%s']/col[1]", codeToFind) 
); 
Node node = (Node) expr.evaluate(docum, XPathConstants.NODE); 
System.out.println(node.getTextContent()); 

輸出:

KUALA LUMPUR CITY CENTRE (KLCC) 

這裏使用的XPath/mapping-table/row[col='my code here']/col[1]這意味着我們正在尋找元素row的第一個孩子col,該孩子有一個孩子col其文字內容是要查找的代碼。

注:上面的代碼假定我們只有一場比賽,如果你希望不止一個匹配,則不但得不到一個Node你需要使用下面的代碼獲得NodeList

NodeList nl = (NodeList) expr.evaluate(docum, XPathConstants.NODESET); 
for (int i = 0; i < nl.getLength(); i++) { 
    Node node = nl.item(i); 
    System.out.println(node.getTextContent()); 
} 
+0

真的行。我可以有更多有關xPath的信息嗎?因爲我不太瞭解這行代碼。 String.format(「/ mapping-table/row [col ='%s']/col [1]」,code)。也許你能向我解釋一下嗎?謝謝。我會將你的答案標記爲最佳答案。 –

+0

我在答案的最後解釋了(在NB之前),它不夠清楚? –

+0

等於是。我必須進入確切的行並始終獲得第一列? –