2010-11-15 58 views
3

我想从一个XML文件中的属性值,失败,但我的代码失败,下面的异常:XPath表达式用于获取属性值在Java中

11-15 16:34:42.270: DEBUG/XpathUtil(403):异常= javax.xml.xpath.XPathExpressionException:javax.xml.transform.TransformerException中:额外非法令牌: '@', '源'

下面是我用得到的代码节点列表:

private static final String XPATH_SOURCE = "array/[email protected]"; 
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正在抱怨这个标志。

回答

6

尝试

array/extConsumer/@source 

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

1

放一个斜杠属性规范之前:

array/extConsumer/@source 
1

您链接W3Schools的页面也说“谓语被嵌入在中括号”。您只需附加@source。尝试

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

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