2011-11-22 53 views
3

我想要搜索特定關鍵字的DOM,找到它時,我想知道它來自樹中的哪個節點。查找節點中的關鍵字並獲取DOM中的節點名稱

static void search(String segment, String keyword) { 

    if (segment == null) 
     return; 

    Pattern p=Pattern.compile(keyword,Pattern.CASE_INSENSITIVE); 
    StringBuffer test=new StringBuffer (segment); 
    matcher=p.matcher(test); 

    if(!matcher.hitEnd()){   
     total++; 
     if(matcher.find()) 
     //what to do here to get the node? 
    } 
} 

public static void traverse(Node node) { 
    if (node == null || node.getNodeName() == null) 
     return; 

    search(node.getNodeValue(), "java"); 

    check(node.getFirstChild()); 

    System.out.println(node.getNodeValue() != null && 
         node.getNodeValue().trim().length() == 0 ? "" : node); 
    check(node.getNextSibling()); 
} 
+0

這是什麼語言?它看起來像Java或可能C#,如果你在問題標籤中包含語言,你將更有可能得到答案。 – kamui

+0

是它的Java和感謝您的評論:) – lonesome

+0

我發現很難理解你想達到什麼,但可能你想從搜索返回一個布爾值來表明該令牌已被找到。如果你指定更好的目標,這將更容易幫助。 – Miquel

回答

3

考慮使用XPathAPI):

// the XML & search term 
String xml = "<foo>" + "<bar>" + "xml java xpath" + "</bar>" + "</foo>"; 
InputSource src = new InputSource(new StringReader(xml)); 
final String term = "java"; 
// search expression and term variable resolver 
String expression = "//*[contains(text(),$term)]"; 
final QName termVariableName = new QName("term"); 
class TermResolver implements XPathVariableResolver { 
    @Override 
    public Object resolveVariable(QName variableName) { 
    return termVariableName.equals(variableName) ? term : null; 
    } 
} 
// perform the search 
XPath xpath = XPathFactory.newInstance().newXPath(); 
xpath.setXPathVariableResolver(new TermResolver()); 
Node node = (Node) xpath.evaluate(expression, src, XPathConstants.NODE); 

如果你想通過正則表達式來進行更復雜的匹配,你可以提供自己的function resolver

擊穿XPath表達式//*[contains(text(),$term)]的:

  • //*星號選擇所有的元素;雙斜線指任何父
  • [contains(text(),$term)]是一個匹配的文本
  • text()謂詞是,獲得了所述元素的文本
  • $term是變量的函數;這可以用來通過變量解析器來解析術語「java」;解析器優選字符串連接,以防止注入攻擊(類似於SQL注入的問題)
  • contains(arg1,arg2)是,如果包含的arg1 arg2的

XPathConstants.NODE通知API選擇單個節點,則返回true的函數;您可以使用NODESET來獲得所有匹配項作爲NodeList

+0

XPath簡介:[XML簡介:第9章:XPath](http://oreilly.com/catalog/xmlnut/chapter/ch09.html)。 Java XPath教程:[developerWorks](http://www.ibm.com/developerworks/library/x-javaxpathapi/index.html) – McDowell

+0

哇,令人困惑的是,你能解釋一下,至少是你爲變量設置的值嗎?例如標籤,你宣佈和「術語」) – lonesome

+0

哦這麼快你,謝謝:) – lonesome