在Java中获取属性值的Xpath表达式失败

在Java中获取属性值的Xpath表达式失败,java,xpath,Java,Xpath,我试图从XML文件中获取属性值,但代码失败,出现以下异常: 11-15 16:34:42.270:DEBUG/XpathUtil(403):exception=javax.xml.xpath.XPathExpressionException:javax.xml.transform.TransformerException:额外非法标记:“@”,“源” 下面是我用来获取节点列表的代码: private static final String XPATH_SOURCE = "array/extCon

我试图从XML文件中获取属性值,但代码失败,出现以下异常:

11-15 16:34:42.270:DEBUG/XpathUtil(403):exception=javax.xml.xpath.XPathExpressionException:javax.xml.transform.TransformerException:额外非法标记:“@”,“源”

下面是我用来获取节点列表的代码:

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
方法中抛出了一个异常


现在,根据,要获取属性值,请使用“@”符号。但是出于某种原因,Java抱怨这个符号。

在属性spec前面加一个斜杠:

array/extConsumer/@source

您链接到的w3schools页面还显示“谓词总是嵌入在方括号中。”您只需添加
@source
。试一试

private static final String XPATH_SOURCE = "array/extConsumer[@source]";
编辑:
要明确的是,这是如果你正在寻找一个单一的项目,这是你最初的措辞让我相信。如果您想收集一组源属性,请参阅vanje和Anon的答案,其中建议使用斜杠而不是方括号。

试试看

array/extConsumer/@source
作为XPath表达式。这将选择extConsumer元素的源属性