JavaEE XML XPath

JavaEE XML XPath

@author ixenos

XPath技术

1 引入

问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!!需要遍历DOM树的众多节点来进行查找!

比如rootEle.element(“dsfs”).element(“sdfsf”)element(“sdfsf”). element(“aim”)

2 xPath作用

主要是用于快速获取所需的节点对象。

(XSLT中的match属性的值就使用XPath!!!)

3 在dom4j中如何使用xPath技术

1)导入xPath支持jar包 。  jaxen-1.1-beta-6.jar

2)使用xpath方法

List<Node>  selectNodes("xpath表达式");   查询多个节点对象

Node       selectSingleNode("xpath表达式");  查询一个节点对象

4 xPath语法

/      绝对路径      表示从xml的根位置开始或子元素(一个层次结构)

//     相对路径       表示不分任何层次结构的选择元素。

*      通配符         表示匹配所有元素

[]      条件           表示选择什么条件下的元素

@     属性            表示选择属性节点

and     关系          表示条件的与关系(等价于&&)

text()    文本           表示选择文本内容

示例:

XPath可以描述XML文档中的一个节点集

/grib/row

描述了grib的子元素(每一个grib)中所有的row元素

/grib/row[1]

用[]选择特定元素,这表示第一行(索引从1开始)

/grib/row[1]/cell[1]/@anchor

用@得到属性值,这描述了第一行第一个单元格的anchor属性

/grib/row/cell/@anchor

描述了作为根元素的grib的子元素的那些row元素中所有cell的anchor属性

		/**
		 * 1.  	/      绝对路径      表示从xml的根位置开始或子元素(一个层次结构)
		 */
		xpath = "/contactList";
		xpath = "/contactList/contact";

		/**
		 * 2. //     相对路径       表示不分任何层次结构的选择元素。
		 */
		xpath = "//contact/name";
		xpath = "//name";

		/**
		 * 3. *      通配符         表示匹配所有元素
		 */
		xpath = "/contactList/*"; //根标签contactList下的所有子标签
		xpath = "/contactList//*";//根标签contactList下的所有标签(不分层次结构)

		/**
		 * 4. []      条件           表示选择什么条件下的元素
		 */
		//带有id属性的contact标签
		xpath = "//contact[@id]";
		//第二个的contact标签
		xpath = "//contact[2]";
		//选择最后一个contact标签
		xpath = "//contact[last()]";

		/**
		 * 5. @     属性            表示选择属性节点
		 */
		xpath = "//@id"; //选择id属性节点对象,返回的是Attribute对象
		xpath = "//contact[not(@id)]";//选择不包含id属性的contact标签节点
		xpath = "//contact[@id=‘002‘]";//选择id属性值为002的contact标签
		xpath = "//contact[@id=‘001‘ and @name=‘eric‘]";//选择id属性值为001,且name属性为eric的contact标签

		/**
		 *6.  text()   表示选择文本内容
		 */
		//选择name标签下的文本内容,返回Text对象
		xpath = "//name/text()";
		xpath = "//contact/name[text()=‘张三‘]";//选择姓名为张三的name标签

  更多XPath表达式请看XPath Tutorial

Demo:

import java.io.File;
import java.io.FileOutputStream;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * 第一个xpath程序
 * @author ixenos
 *
 */
public class Demo1 {

	public static void main(String[] args) throws Exception{
		/**
		 * 需求: 删除id值为2的学生标签
		 */
		Document doc = new SAXReader().read(new File("e:/student.xml"));

		//1.查询id为2的学生标签
		//使用xpath技术
		Element stuElem = (Element)doc.selectSingleNode("//Student[@id=‘2‘]");

		//2.删除标签
		stuElem.detach();

		//3.写出xml文件
		FileOutputStream out = new FileOutputStream("e:/student.xml");
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("utf-8");
		XMLWriter writer = new XMLWriter(out,format);
		writer.write(doc);
		writer.close();
	}

}

  

简要示例



1) 用XPath定位标签,进行修改操作

package com.ixenos.xpath;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.ixenos.dom4j.CreateXML;

/**
 * 在TestXPath的基础上改进了:
 * 将精准定位全交给XPath去做,因此删除了modEle多余的属性定位判断
 *
 * @author ixenos
 *
 */
public class TestXPath2 {

	/**
	 * 读取XML文件生成Docment
	 *
	 * @throws Exception
	 */
	public static Document getDoc(String path) throws Exception {
		Document doc = new SAXReader().read(path);
		return doc;
	}

	/**
	 * XPath定位标签
	 */
	@SuppressWarnings("unchecked")
	public static List<Element> getEle(Document doc, String xpath) {
		return (List<Element>)doc.selectNodes(xpath);
	}

	/**
	 * 对指定标签的属性进行修改
	 *
	 * @param func
	 *            修改功能选择
	 * @param eleList
	 *            被修改的标签list
	 * @param locateAttr
	 *            用于定位标签的属性
	 * @param locateAttrValue
	 *            用于定位标签的属性的属性值
	 * @param aimChild
	 *            想要修改的子标签
	 * @param aimChildText
	 *            想要修改的新的子标签文本值
	 */
	public static void modEle(String func, List<Element> eleList, String aimChild, String aimChildText) {
		// 取出
		for (Element ele : eleList) {
			// 修改功能选择
			if ("delete".equals(func)) {
				ele.detach();
			} else if ("modify".equals(func)) {
				// 修改指定属性的属性值
				// element(name)指定第一个标签名为name的标签
				// setText修改Text,addText追加Text
				ele.element(aimChild).setText(aimChildText);
			}
		}

	}

	/**
	 * 将DOM树输出为XML文件
	 *
	 * @throws Exception
	 */
	public static void writeXML(Document doc, Boolean pretty, String encoding) throws Exception {
		CreateXML.writeXML(doc, pretty, encoding);
	}

	/**
	 * 测试
	 *
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		Document doc = getDoc("demo.xml");

		//得到所有id属性值为2的Student标签
		List<Element> eleList = getEle(doc, "//Student[@id=‘2‘]");

		modEle("modify", eleList, "name", "李尔雅");
		// modEle("delete", eleList, null, null);
		writeXML(doc, true, "utf-8");

	}
}

  

修改结果:

<?xml version="1.0" encoding="utf-8"?>

<Students>
  <Student id="1">
    <name>张三</name>
    <gender>男</gender>
    <grade>物联网一般</grade>
    <address>广州白云</address>
  </Student>
  <Student id="2">
    <name>尔雅</name>
    <gender>女</gender>
    <grade>物联网二班</grade>
    <address>广州海珠</address>
  </Student>
</Students>

  

2) 用XPath读取一个规范的html文件(比如xhtml)

import java.io.File;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 使用xpath技术读取一个规范的html文档
 * @author ixenos
 *
 */
public class Demo4 {

	public static void main(String[] args) throws Exception{
		Document doc = new SAXReader().read(new File("./src/personList.html"));
		//System.out.println(doc);

		//读取title标签
		Element titleElem = (Element)doc.selectSingleNode("//title");
		String title = titleElem.getText();
		System.out.println(title);

		/**
		 * 练习:读取联系人的所有信息
		 * 按照以下格式输出:
		 * 		 编号:001 姓名:张三 性别:男 年龄:18 地址:xxxx 电话: xxxx
		 *       编号:002 姓名:李四 性别:女 年龄:20 地址:xxxx 电话: xxxx
		 *       ......
		 */
		//1.读取出所有tbody中的tr标签
		List<Element> list = (List<Element>)doc.selectNodes("//tbody/tr");
		//2.遍历
		for (Element elem : list) {
			//编号
			//String id = ((Element)elem.elements().get(0)).getText();
			String id = elem.selectSingleNode("td[1]").getText();
			//姓名
			String name = ((Element)elem.elements().get(1)).getText();
			//性别
			String gender = ((Element)elem.elements().get(2)).getText();
			//年龄
			String age = ((Element)elem.elements().get(3)).getText();
			//地址
			String address = ((Element)elem.elements().get(4)).getText();
			//电话
			String phone = ((Element)elem.elements().get(5)).getText();

			System.out.println("编号:"+id+"\t姓名:"+name+"\t性别:"+
								gender+"\t年龄:"+
								age+"\t地址:"+address+
								"\t电话:"+phone);
		}
	}
}

  

时间: 2024-10-12 19:57:59

JavaEE XML XPath的相关文章

WP8 中使用HTML Agility Pack与友盟分享SDK遇到的 System.Xml.XPath加载问题

今晚在尝试使用友盟最新的社交分享SDK时,按照官方Demo,并未做多少多少改动,就是去除了对微信.脸书和推特的分享.然后运行之后就一直报错 : {System.IO.FileLoadException: Could not load file or assembly 'System.Xml.XPath, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. Th

JavaEE XML 基础知识

JavaEE XML 基础知识 @author ixenos 1.    XML开头都需要一个声明 <?和?>表明这是一个处理指令 <?xml version=”1.0” encoding=”UTF-8” ?> 2.    <book id=”1.0”> </book> 等同于: <book> <id>1.0</id> </book> 3.    XML格式能够表达层次结构(树),并且重复的元素不会被曲解 4.

XML XPath语法总结

刚刚遇到一个多重查询xmlDoc.SelectSingleNode("Root/Element[@Name='大气象'][@Age='30']")根据innerText查询xmlDoc.SelectSingleNode("Root/Element[text()='大气象']")顺便收集总结一下.Xml中SelectSingleNode方法中的xpath用法 最常见的XML数据类型有:Element, Attribute,Comment, Text. Element,

JavaEE XML XSL转换(XSLT)

XSL转换(XSLT) @author ixenos 定义: XSL转换机制可以指定将XML文档转换为其他格式的规则,例如,txt纯文本.XHTML或其他任何XML格式. 用途: XSLT通常用来将某种机器可读的XML格式转译为另一种机器可读的XML格式,或者将XML转译为适合人类阅读的表示格式 步骤: 1. 需要提供XSLT样式表,它描述了XML文档向某种格式转换的规则 2. XSLT处理器读入XML文档和XSLT样式表,产生所要的输出 XSLT样式表: <?xml version="1

JavaEE XML DOM4J解析

DOM4J解析 @author ixenos DOM4J常用API SAXReader reader = new SAXReader(); //Document对象也看成根节点 Document doc = reader.read(File file); //迭代当前节点下的子节点/也可foreach Iterator itr = doc.nodeIterator(); While(itr.hasNext()){ Node node = itr.next(); } //得到根节点 Element

【JavaScript.6】阶段概念总结之HTML+CSS+JavaScript+xml+xpath+Json+Ajax

[前言] 最近学习了很多BS的新东西,有很多新名称,概念多了,理解也少了,很多东西都混乱.今天静下来把学到的几 个概念性东西总结一下.本文多是一些概念性的个人理解,希望同样存在疑惑的小伙伴看完后能够如入桃源般地豁然 开朗.当然如果我的理解有偏差,请指出来,共同进步. 关于BS的学习,相信很多人都已经走过了,当初最开始接触的是牛腩,里面用到了很多BS的知识,包括HTML. CSS.JavaScript和Ajax等.对于有基础或者正处于迷惑之间的人来说,接下来的话可能会很有感触. [HTML] 首先

XML Xpath学习

Xpath是一门在xml文档中查找信息的语言. Xpath可用来在xml文档中对元素和属性进行遍历. <1>路径表达式1: 斜杠(/)作为路径内部的分隔符 同一个路径有绝对路径和相对路径两种写法 绝对路径:必须用"/"起首,后面紧跟根节点.如/step/setp 相对路径:不用"/"起首.如step/step "."表示当前节点 ".."表示当前路径的父节点 <2>路径表达式2: nodename(节点

XML——XPATH语法介绍

为什么需要xpath? 在使用dom4j的时候,我们不能跨层获取某一个元素,必须一层一层去获取,这就非常麻烦. 所以为了我们更方便地访问某个节点,我们可以使用xpath技术,它可以让我们非常方便地读取到指定节点. xpath通常结合dom4j配合使用,而且如果要使用xpath,则需要引入一个新的包jaxen-1.1-beta-6.jar xpath的基础语法有以下几点: 1.基本的xpath语法类似于在一个文件系统中定位文件,如果路径以斜线/开始,那么该路径就表示到一个元素的绝对路径. (1)/

Java xml 操作(Dom4J修改xml &#160;&#160;+ xPath技术 &#160;+ SAX解析 + XML约束)

1 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空格,区分大小写.有且仅有一个根标签. 属性: 可有多个属性,但属性值必须用引号(单引号或双引号)包含,但不能省略,也不能单 双混用. 文档声明: <?xml version="1.0" encoding="utf-8"?> encoding="utf-8&q