XML语法和解析
概述
XML中文名可扩展标记语言,可理解为软件与软件之间互通消息的语言,具有平台无关性。目前主要用于配置文件,与JSON相比具有可读性高的优点,但解析速度远不如JSON,因此只在某些配置文件中使用。
XML文档结构
与HTML一样,XML文档结构由标签组成,标签也可称之为标记、元素、节点。标签与标签之间的关系可以包含、嵌套。
一个标签的基本语法格式为:
<开始标记名>标记内容</结束标记名>
文档结构注意事项
- 一个xml文档中,有且仅有一个根标记(就是说最外边的标记只有一个)
- 标记可以嵌套,不许交叉
- 标记中包含属性,属性写在开始标签中,由属性名和属性值组成,属性名不许重复,属性值必须用双引号包裹,多个属性间用空格隔开,属性值与属性名之间用"="连接
- 注释:注释不能写在文档声明前
注释格式:
<!--注释内容 -->
自定义标签名称注意事项:
- 不能包含"xml"的大写和小写形式。
- 不能以数字开头,
- 不能包含":"或空格
- 区分大小写
CDATA
CDATA不会被解析器解析,脚本代码经常写入XML中的CDATA中
CDATA格式:
<![CDATA[...脚本代码...]]>
DOM4j解析XML文件基本流程
-
引入jar文件dom4j.jar
-
创建一个XML文件的输入流
FileInputStream fis = new FileInputStream("XML文件地址");//本地
//2.1 创建URL对象
URL url= new URL("网址");
//2.2 调用URL对象的openConnection()得到URLConnection对象
URLConnection conn = url.openConnection();
//2.3 通过URLConnection对象调用getInputStream()得到输入流对象
InputStream is = conn.getInputStream();//网络
- 创建一个XML读取工具对象
SAXReader sr= new SAXReader();
- 使用读取工具对象读取文档输入流,得到文档对象
Document doc = sr.read(fis);
- 通过文档对象得到XML中的根元素对象
Element root = doc.getRootElement();
- 关闭流
fis.close();
DOM4j操作XML文件节点常用方法
| 方法 | 描述 |
|---|---|
| String getName() | 获取节点名称 |
| String getText() | 获取节点内容 |
| String setText() | 设置节点内容 |
| Element element(String 子节点名称) | 根据子节点名称,获取匹配的第一个子节点对象 |
| List |
获取所有子节点对象 |
| String attributeVaule(String 属性名称) | 获取节点的属性值 |
| String elementText(String 子节点名称) | 获取子节点的内容 |
| Element addElement(String 子结点名称) | 添加子节点 |
| void addAttribute(String 属性名,String 属性值) | 添加属性 |
| 注意:具有父子节点关系的对象调用才能获得对应子结点的数据 |
读取XML文件案例(本地)
public static void main(String[] args) throws IOException, DocumentException {
//1.引入dom4j.jar
//2.创建xml文件输入流
FileInputStream fis = new FileInputStream("D://Demo1.xml");
//3.创建读取工具对象SAXReader
SAXReader sr = new SAXReader();
//4.读取输入流得到Document对象
Document doc = sr.read(fis);
//5.根据文档对象得到根节点
Element root = doc.getRootElement();
List<Element> es = root.elements();
for (Element e :
es) {
System.out.println(e.attributeValue("id"));
System.out.println(e.elementText("name"));
System.out.println(e.elementText("info"));
}
fis.close();
}
读取XML文件(网络文件)
XML格式信息:

public static void main(String[] args) throws IOException, DocumentException {
String phone = "18516955565";
//获得XML资源拿到输入流
URL url= new URL("http://apis.juhe.cn/mobile/get?phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
//创建读取对象
SAXReader sr = new SAXReader();
//通过读取对象读取XML数据并返回文档对象
Document doc = sr.read(is);
//获取根节点
Element root = doc.getRootElement();
//解析内容
String code = root.elementText("resultcode");
if ("200".equals(code)) {
Element result = root.element("result");
String province = result.elementText("province");
String city = result.elementText("city");
if (province.equals(city)){
System.out.println("手机号码归属地为:"+city);
}else{
System.out.println("手机号归属地为:"+province+" "+city);
}
}else {
System.out.println("手机号不正确");
}
}
XPath解析XML
与dom4j流程只有第一步不同,除了引入dom4j.jar外,还要引入jaxen1.1-bete-7.jar
路径表达式语法
| 方法 | 说明 |
|---|---|
| / | 从根节点开始查找 |
| // | 从发起查找的节点位置开始查找后代节点 |
| . | 查找当前节点 |
| .. | 查找父节点 |
| [@属性名='值'] | 查找对应属性 |
| [@属性名<'值'] | 查找对应属性 |
| [@属性名>'值'] | 查找对应属性 |
| [@属性名!='值'] | 查找对应属性 |
使用Document对象调用的方法
| 方法 | 说明 |
|---|---|
| Element selectSingleNode("路径表达式") | 查找单个节点 |
| List |
查找多个节点 |
使用XPath解析案例
public static void main(String[] args) throws IOException, DocumentException {
//1.引入dom4j.jar,jaxen-1.1-beta-7.jar
//2.创建xml文件输入流
FileInputStream fis = new FileInputStream("D://Demo1.xml");
//3.创建读取工具对象SAXReader
SAXReader sr = new SAXReader();
//4.读取输入流得到Document对象
Document doc = sr.read(fis);
//5.根据文档对象得到根节点
//Element root = doc.getRootElement();
//单节点路径表达式查询
/*
"//父节点名[@属性名='属性值']//子节点名"
*/
System.out.println(doc.selectSingleNode("//book[@id='1001']//info").getText());
System.out.println(doc.selectSingleNode("//name").getText());
//多节点路径表达式查询
List<Element> list = doc.selectNodes("//book");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).elementText("name"));
System.out.println(list.get(i).elementText("info"));
System.out.println("------");
}
fis.close();
}
java对象生成XML文件
基本流程如下:
- 引入dom4j.jar
- 通过文档帮助器创建文档对象
Document doc = DocumentHelper.createDocument();
- 向文档对象中加入根节点
Element root = doc.addElement("节点名称");
- 向根节点中加入子节点
doc.setAttribute("属性名称","属性值");
[Element e] = doc.addElement("节点名称").setText("节点值");
- 创建文件输出流对象
FileOutputStream fos = new FileOutputStream();
- 将文件输出流对象转换为XML输出流对象
XMLWriter xw = new XMLWriter(fos);
- 将文档对象写出
xw.write(doc);
8.关闭流
xw.close();
fos.close();
Java对象输出XML文件格式案例
public static void main(String[] args) throws IOException{
//1.引入Dom4j.jar
//2.通过文档帮助器创建文档对象
Document doc = DocumentHelper.createDocument();
//3.文档对象中加入根节点
Element root = doc.addElement("books");
//4.根节点中加入子结点
Element book = root.addElement("book");
book.addAttribute("id","1001");
book.addElement("name").setText("金苹果");
book.addElement("info").setText("金苹果info");
Element book2 = root.addElement("book");
book2.addAttribute("id","1002");
book2.addElement("name").setText("银平果");
book2.addElement("info").setText("银平果info");
//5.创建文件输出流对象
FileOutputStream fos = new FileOutputStream("D://Demo3.xml");
//6.将文件输出流转化问XML输出流
XMLWriter xw = new XMLWriter(fos);
//7.将文档对象输出
xw.write(doc);
//8.关闭流
xw.close();
fos.close();
}
浙公网安备 33010602011771号