xml基本介绍
xml基本语法:
1.xml文档的后缀名为.xml
2.xml第一行必须定义为文档声明
3.xml文档有且仅有一个根标签
4.属性值必须使用引号(单双都可以)引起来
5.标签必须正确关闭
6.xml标签名区分大小写
组成部分
1.文档声明 格式:<?xml 属性列表 ?>
version:版本号(必须); encoding:编码格式; standalone:是否独立 取值:yes,no
2.标签:名称自定义,并且按照规则
3.属性:id属性值唯一
4.文本:CDATA区:在该区域中的数据会被原样展示,格式:<![CDATA[ 数据 ]]>
约束:规定xml文档的书写规则
dtd:简单的约束技术
schema:复杂的约束技术
DTD:内部dtd:将约束规则定义在xml文档中;外部dtd:将约束定义在外部dtd文件中
外部dtd:本地:<! DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
网络:<! DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
java解析xml文件的几种方法
解析xml有两种形式,其分别为:
DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
优点:操作方便,可以对文档进行CRUD(增删改查)的所有操作
缺点:占内存
SAX:逐行读取,基于事件驱动
优点:不占内存
缺点:只能读取
以下面这个简单的xml文件的解析为例,具体内容参考https://www.w3school.com.cn/xmldom/dom_parser.asp
<?xml version="1.0" encoding="UTF-8"?> <peoples> <people number="1"> <name id="zs">张三</name> <age>12</age> </people> <people> <name>李四</name> <age>15</age> </people> </peoples>
第一种,使用DOM对xml进行解析
import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; public class testXml { public static void main(String[] args) { try{ File xml = new File("test/test.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(xml); NodeList list = doc.getElementsByTagName("people"); for(int i=0;i<list.getLength();i++){ Element e = (Element)list.item(i); System.out.println("姓名:"+e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue() +"年龄:"+e.getElementsByTagName("age").item(0).getFirstChild().getNodeValue()); } }catch (Exception e){ e.printStackTrace(); } } }
第二种形式,DOM4J进行解析
import java.io.*; import java.util.*; import org.dom4j.*; import org.dom4j.io.*; public class testDOM4J { public static void main(String[] args) { try{ File f = new File("test/test.xml"); SAXReader reader = new SAXReader(); Document doc = reader.read(f); Element root = doc.getRootElement(); Element n; for (Iterator i=root.elementIterator("people");i.hasNext();) { n = (Element) i.next(); System.out.println("姓名:"+n.elementText("name")+" 年龄:"+n.elementText("age")); } }catch(Exception e){ e.printStackTrace(); } } }
第三种形式,JDOM进行解析
import java.util.*; import org.jdom2.*; import org.jdom2.input.*; import java.io.File; public class testJDOM { public static void main(String[] args) { try{ File f = new File("test/test.xml"); SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(f); Element e = doc.getRootElement(); List li = e.getChildren(); Element temp; for(int i=0;i<li.size();i++){ temp = (Element) li.get(i); System.out.println("姓名:"+temp.getChild("name").getText()+" 年龄:"+temp.getChild("age").getText()); } }catch (Exception e){ e.printStackTrace(); } } }
Jsoup是一款Java 的HTML解析器,可直接解析某个URL地址、HTML、XML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.File; public class testJsoup { public static void main(String[] args) { try{ //1.获取xml解析文件的路径 File f = new File("test/test.xml"); //2.解析xml文档,加载文档进内存,获取Jsoup 的document对象 Document document = Jsoup.parse(f,"UTF-8"); //解析xml Elements elements = document.getElementsByTag("name"); for(int i=0;i<elements.size();i++){ System.out.println("姓名:"+elements.get(i).text()); } }catch (Exception e){ e.printStackTrace(); } } }
其中:
parse方法:解析xml或html对象。
Document :文档对象。代表内存中的dom树。
获取Element对象:1.根据标签名获取对象集合 public Elements getElementsByTag(String tagName)。
2.根据属性名称获取对象集合 public Elements getElementsByAttribute(String key)
。
3.根据对应的属性名和值获取元素对象集合 public Elements getElementsByAttributeValue(String key, String value)
4.根据ID属性获取唯一的element public Element getElementById?(String id)
Elements :Element对象的集合。可以当作ArrayList来使用
Element :元素对象
*获取子元素对象
*获取属性值 String attr(String key)
*获取文本内容 String text()
Node :节点对象 Document和Element的父类
1.selector选择器: 使用的方法:Elements select(String cssQuery)
2.XPath。使用Jsoup的xpath需要额外导入jar包。具体可以查询w3cschool参考手册
两种方法的示例代码
1.selector选择器
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.File; public class testJsoup { public static void main(String[] args) { try{ //1.获取xml解析文件的路径 File f = new File("test/test.xml"); //2.解析xml文档,加载文档进内存,获取Jsoup 的document对象 Document document = Jsoup.parse(f,"UTF-8"); //使用选择器进行查询,查询name标签 Elements elements = document.select("name"); System.out.println(elements.get(0).text()); //根据id进行查询 Elements id = document.select("#zs"); System.out.println(id.get(0).text()); //根据值查找 Elements select = document.select("people[number=\"1\"]"); System.out.println(select.text()); //查找people中number等于1中的age子标签 Elements select1 = document.select("people[number=\"1\"]>age"); System.out.println(select1.text()); }catch (Exception e){ e.printStackTrace(); } } }
2.XPATH
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.File; public class testJsoupXpath { public static void main(String[] args) { try{ //1.获取xml解析文件的路径 File f = new File("test/test.xml"); //2.解析xml文档,加载文档进内存,获取Jsoup 的document对象 Document document = Jsoup.parse(f,"UTF-8"); //剧创建JXDocumnet对象 JXDocument jxDocument=new JXDocument(document); //结合xpath语法查询 List<JXNode> jxNodes = jxDocument.selN("//people"); System.out.println(jxNodes); List<JXNode> jxNode = jxDocument.selN("//people[@number=‘1‘]"); System.out.println(jxNode); }catch (Exception e){ e.printStackTrace(); } } }
原文:https://www.cnblogs.com/tangyimin/p/12932618.html