Xpath expression to get attribute value not executed in Java

I am trying to get the attribute value from an XML file, but my code does not work with the exception below:

11-15 16: 34: 42.270: DEBUG / XpathUtil (403): exception = javax.xml.xpath.XPathExpressionException: javax.xml.transform.TransformerException: additional illegal tokens: '@', 'source'

Here is the code I use to get the node list:

private static final String XPATH_SOURCE = "array/extConsumer@source";
mDocument = XpathUtils.createXpathDocument(xml);

NodeList fullNameNodeList = XpathUtils.getNodeList(mDocument,
                XPATH_FULLNAME);

And here is my class XpathUtils:

public class XpathUtils {

    private static XPath xpath = XPathFactory.newInstance().newXPath();
    private static String TAG = "XpathUtil";

    public static Document createXpathDocument(String xml) {
        try {

            Log.d(TAG , "about to create document builder factory");
            DocumentBuilderFactory docFactory = DocumentBuilderFactory
                    .newInstance();
            Log.d(TAG , "about to create document builder ");
            DocumentBuilder builder = docFactory.newDocumentBuilder();

            Log.d(TAG , "about to create document with parsing the xml string which is: ");

            Log.d(TAG ,xml );
            Document document = builder.parse(new InputSource(
                    new StringReader(xml)));

            Log.d(TAG , "If i see this message then everythings fine ");

            return document;
        } catch (Exception e) {
            e.printStackTrace();
            Log.d(TAG , "EXCEPTION OCCURED HERE " + e.toString());
            return null;
        }
    }

    public static NodeList getNodeList(Document doc, String expr) {
        try {
            Log.d(TAG , "inside getNodeList");
            XPathExpression pathExpr = xpath.compile(expr);
            return (NodeList) pathExpr.evaluate(doc, XPathConstants.NODESET);
        } catch (Exception e) {
            e.printStackTrace();
            Log.d(TAG, "exception = " + e.toString());
        }
        return null;
    }

    // extracts the String value for the given expression
    public static String getNodeValue(Node n, String expr) {
        try {
            Log.d(TAG , "inside getNodeValue");
            XPathExpression pathExpr = xpath.compile(expr);
            return (String) pathExpr.evaluate(n, XPathConstants.STRING);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

I get an exception thrown in the method getNodeList.

Now, according to http://www.w3schools.com/xpath/xpath_syntax.asp , you use the "@" sign to get the attribute value. But for some reason, Java complains about this character.

+3
3

array/extConsumer/@source

XPath. source extConsumer.

+6

:

array/extConsumer/@source
+1

The w3schools page you link to also says: "Predicates are always inserted in square brackets." You just added @source. Try

private static final String XPATH_SOURCE = "array/extConsumer[@source]";

EDIT:
To be clear, this is if you are looking for some kind of subject, and this is what your original wording believed me to be. If you want to put together a bunch of source attributes, see Vanj and Anon Answers, which suggest using slashes instead of square brackets.

+1
source

Source: https://habr.com/ru/post/1774988/


All Articles