Что касается XPath с использованием Java - PullRequest
1 голос
/ 14 марта 2012

У меня проблема с получением значения элемента путем предоставления XPath с использованием Java.Я много чего пробовал, но не смог.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import com.dell.logistics.framework.transform.NamespaceContext;

public class GetXPath {

    protected Object evaluate(String xpathStr, String xml, String namespaces) throws XPathExpressionException {
        InputSource inputSource = new InputSource(new StringReader(xml));
        XPathFactory factory = XPathFactory.newInstance();
        XPath xPath = factory.newXPath();
        NamespaceContext nsContext = new NamespaceContext();
        nsContext.setNamespacesMap(getNsMap(namespaces));
            //System.out.println(nsContext.getPrefix(namespaces));
        xPath.setNamespaceContext(nsContext);
        XPathExpression xpExp = xPath.compile(xpathStr);
        return xpExp.evaluate(inputSource, XPathConstants.NODESET);
    }

    private Map<String, String> getNsMap(String namespaces) {

        String delims = ",";
        String[] nsKeyValue = namespaces.split(delims);
        Map<String, String> mp = new HashMap<String, String>();
        for (String string : nsKeyValue) {
            mp.put(string.split("=")[0], string.split("=")[1]);
            System.out.println(string.split("=")[0] + string.split("=")[1]);
        }
       return mp;
    }

    public static String readFile(String fileName) {
        try {
        //    InputStream is = null;
              InputStream is = GetWorkOrderDataExtractor.class.getResourceAsStream(fileName);
              BufferedReader br = new BufferedReader(new InputStreamReader(is));
              StringBuffer sb = new StringBuffer();
              String l = null;
              while ((l = br.readLine()) != null) {
                    sb.append(l).append("\n");
              }
              return sb.toString();
        } catch (Exception e) {
              e.printStackTrace();
        }
        return null;
  }


    public static void main(String[] args) 
   throws ParserConfigurationException, SAXException, 
          IOException, XPathExpressionException {
        GetXPath g = new GetXPath();
        String xml = readFile("fooewo.xml");
        String value = null;
        System.out.println(xml);


        NodeList containerNodes = (NodeList) g.evaluate(
                "/demo",xml,
                "a=http://schemas.demo.com/it/WorkOrderChannelAckNackResponse/1.0");

        try{
        for (int i = 0; i < containerNodes.getLength(); i++) {

                // get the node value.
                value = containerNodes.item(i).getTextContent();
                System.out.println(value);
            }
        System.out.println("Node Found : " + containerNodes.getLength() + " times");
        } 
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
"

XML-файл:

    <?xml version="1.0" encoding="utf-8"?>
<demo xmlns="try with ur schema">
    <test>
        <value>10</value>
        <color>red</color>
        <animal>dog</animal>
        <day>13</day>
        <age>22</age>
    </test>
    <test>
        <value>20</value>
        <color>green</color>
        <animal>cat</animal>
        <day>12</day>
        <age>23</age>
    </test>
</demo>

Любая помощь приветствуется.

Спасибо,Прадип

1 Ответ

0 голосов
/ 09 ноября 2012

Я думаю, что лучший способ легко оценить XPath - это использовать AXIOMXPath

Вот пример,

OMElement documentElement = new StAXOMBuilder(inStreamToXML).getDocumentElement();
AXIOMXPath xpathExpression = new AXIOMXPath ("/demo");  
List nodeList = (OMNode)xpathExpression.selectNodes(documentElement); 

Просматривая список, вы легко можете получить результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...