通过java中的搜索从xml节点获取值

时间:2016-09-26 07:57:24

标签: java xml

我需要知道我的逻辑是否正确,因为我不熟悉XML节点。 这是我的代码。 JAVA

        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节点。

1 个答案:

答案 0 :(得分: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],表示我们正在寻找元素col的第一个孩子row,其中有一个孩子col的文字content是要查找的代码。

注意:上面的代码假定我们只有一个匹配项,如果您希望有多个匹配项,那么您需要获得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());
}