您的位置:首页 > 其它

JDOM2.0.5版本通过xpath读取xml或读取带有命名空间的xml

2013-11-04 17:12 561 查看
org.jdom2.xpath.XPath类居然标注过时,无奈之下只能研究api。

发现Use XPathFactory/XPathExpression/XPathBuilder
instead.

也就是说jdom应该是将xpath类的功能进行了更加详细的分类。

根据经验进行了一些类的测试,最后得出了读取xml的两种方式。

第一种方式,通过XPathFactory类读取xml

xml文件的内容如下

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<homepages xmlns:xlink="http://www.w3.org/1999/xlink">

<homepage xlink:type="simple"
xlink:href="http://www.w3school.com.cn">Visit W3School</homepage>

<homepage xlink:type="simple"
xlink:href="http://www.w3.org">Visit W3C</homepage>

</homepages>


通过SAXBuilder获取document和root

String path = System.getProperty("user.dir") + "\\src\\com\\xml\\file\\test.xml";

SAXBuilder saxBuilder = new SAXBuilder();

Document document = saxBuilder.build(path);

Element root = document.getRootElement();


建立XPathFactory类的对象,需要引入jaxen的jar包,我们使用JaxenXPathFactory类来生成XPathFactory

XPathFactory factory = JaxenXPathFactory.instance();


生产xpath表达式实例对象,并获取结果集

XPathExpression<Object> objs = factory.compile("//homepages");

List<Object> objList = objs.diagnose(root, false).getResult();


完整代码是

String path = System.getProperty("user.dir") + "\\src\\com\\xml\\file\\test.xml";

SAXBuilder saxBuilder = new SAXBuilder();

Document document = saxBuilder.build(path);

Element root = document.getRootElement();

XPathFactory factory = JaxenXPathFactory.instance();

XPathExpression<Object> objs = factory.compile("//homepages"); List<Object> objList = objs.diagnose(root, false).getResult();


第二种方式,通过XPathBuilder获取xpath表达式的实例对象集合

首先来创建一个filter,org.jdom2.filter.Filters中提供给我们了一些过滤器,我们这里选择元素类型的,Filter接口的全名是org.jdom2.filter.Filter

Filter<Element> filter = Filters.element();


生成XPathBuilder对象

XPathBuilder<Element> builder = new XPathBuilder<Element>("//homepages", filter);


根据它的compileWith(XPathFactory factory)方法来获取到我们需要的xpath表达式的实例对象集合

XPathFactory factory = JaxenXPathFactory.instance();

XPathExpression<Element> objs = builder.compileWith(factory);


之后的方式就和方法1一样了。

完整代码是

String path = System.getProperty("user.dir") + "\\src\\com\\xml\\file\\test.xml";

SAXBuilder saxBuilder = new SAXBuilder();

Document document = saxBuilder.build(path);

Element root = document.getRootElement();

Filter<Element> filter = Filters.element();

XPathBuilder<Element> builder = new XPathBuilder<Element>("//homepages", filter);

XPathFactory factory = JaxenXPathFactory.instance(); XPathExpression<Element> objs = builder.compileWith(factory);

List<Element> objList = objs.diagnose(root, false).getResult();


获取带有命名空间的xml文件内容

使用XPathBuilder的setNamespace方法声明命名空间,Xpath表达式不需要再写"//",例如

XPathBuilder<Element> builder = new XPathBuilder<Element>("ci:Teacher", filter);

builder.setNamespace("ci", "http://www.test.cn/tuple");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: