/*
* Evaluate XPath expressions on an XML file
* Copyright (C) 2004, University of Maryland
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package edu.umd.cs.findbugs.xml;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
/**
* Find nodes in a dom4j tree that match a particular XPath expression. The
* main() driver prints out information about matching nodes in an XML document.
*
* <p>
* For example, to find the list of non-disabled detectors in a FindBugs plugin
* descriptor, you can use the expression <blockquote>
* <code>/FindbugsPlugin/Detector[boolean(@disabled)=false()]/@class</code>
* </blockquote>
*
* @author David Hovemeyer
*/
public abstract class XPathFind {
private Document document;
public XPathFind(Document document) {
this.document = document;
}
@SuppressWarnings("unchecked")
public void find(String xpath) {
List<Node> nodes = XMLUtil.selectNodes(document, xpath);
for (Node node : nodes) {
match(node);
}
}
protected abstract void match(Node node);
public static void main(String[] argv) throws Exception {
if (argv.length != 2) {
System.err.println("Usage: " + XPathFind.class.getName() + ": <filename> <xpath expression>");
System.exit(1);
}
String fileName = argv[0];
String xpath = argv[1];
SAXReader reader = new SAXReader();
Document document = reader.read(fileName);
XPathFind finder = new XPathFind(document) {
@Override
protected void match(Node node) {
// System.out.println(node.toString());
if (node instanceof Element) {
Element element = (Element) node;
System.out.println("Element: " + element.getQualifiedName());
System.out.println("\tText: " + element.getText());
System.out.println("\tAttributes:");
for (Iterator<?> i = element.attributeIterator(); i.hasNext();) {
Attribute attribute = (Attribute) i.next();
System.out.println("\t\t" + attribute.getName() + "=" + attribute.getValue());
}
} else if (node instanceof Attribute) {
Attribute attribute = (Attribute) node;
System.out.println("Attribute: " + attribute.getName() + "=" + attribute.getValue());
}
}
};
finder.find(xpath);
}
}
// vim:ts=4