Выражение Xpath для получения значения атрибута терпит неудачу в Java - PullRequest
3 голосов
/ 15 ноября 2010

Я пытаюсь получить значение атрибута из файла XML, но мой код завершается ошибкой, за исключением следующего:

11-15 16: 34: 42.270: DEBUG / XpathUtil (403):exception = javax.xml.xpath.XPathExpressionException: javax.xml.transform.TransformerException: дополнительные недопустимые токены: '@', 'source'

Вот код, который я использую для получения списка узлов:

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

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

А вот мой 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;
    }

Я получаю исключение в методе getNodeList.

Теперь, согласно http://www.w3schools.com/xpath/xpath_syntax.asp,, чтобы получить значение атрибута, вы используете знак "@".Но по какой-то причине Java жалуется на этот символ.

Ответы [ 3 ]

6 голосов
/ 15 ноября 2010

Попробуйте

array/extConsumer/@source

в качестве выражения XPath.Выбирает атрибут источника элемента extConsumer.

1 голос
/ 15 ноября 2010

На странице w3schools, на которую вы ссылались, также написано: «Предикаты всегда заключены в квадратные скобки».Вы только что добавили @source.Попробуйте

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

РЕДАКТИРОВАТЬ:
Для ясности, это если вы ищете какой-то один пункт, и именно это заставило меня поверить в вашу первоначальную формулировку.Если вы хотите собрать несколько исходных атрибутов, посмотрите ответы Ванье и Анона, в которых предлагается использовать косую черту вместо квадратных скобок.

1 голос
/ 15 ноября 2010

Поставьте косую черту перед спецификацией атрибута:

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