2016-09-26 41 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

等于是。我必须进入确切的行并始终获得第一列? –