代码之家  ›  专栏  ›  技术社区  ›  Jono

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

  •  3
  • Jono  · 技术社区  · 14 年前

    我试图从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 回复  |  直到 14 年前
        1
  •  6
  •   vanje    14 年前

    尝试

    array/extConsumer/@source
    

    作为您的XPath表达式。这将选择extConsumer元素的源属性。

        2
  •  1
  •   Anon    14 年前

    在属性规范前加斜杠:

    array/extConsumer/@source
    
        3
  •  1
  •   Pops Atula    14 年前

    你链接到的w3schools页面还说“谓词总是嵌入方括号中” @source . 尝试

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

    编辑:
    要说清楚,这是如果你在寻找一个单一的项目,这是你最初的措辞让我相信。如果你想收集一堆源属性,请参阅vanje和Anon的答案,他们建议使用斜线而不是方括号。