DTD验证文档:
<?xml version="1.0" encoding="UTF-8"?>
<!-- <!DOCTYPE books [
<!ELEMENT books (book*)>
<!ELEMENT book (name,author,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST book id CDATA #REQUIRED>
]>-->
<books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="{book.xsd}">
<book id="1001">
<name>java开发实战</name> <author>张小三</author>
<price>98.5</price>
</book>
<book id="1002">
<name>mysql从删库到跑路</name>
<author>王一一</author>
<price>89.7</price>
</book>
</books>
DOM方式解析XML:
package xmlDOM;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class TestxmlDOMParsew {
public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException {
//创建一个Document builder factory的对象
DocumentBuilderFactory bdf = DocumentBuilderFactory.newInstance();
//创建一个DocumentBuilder对象
DocumentBuilder db=bdf.newDocumentBuilder();
//通过DocumentBuilder的parse(。。。)方法得到document对现场
Document doc = db.parse("book.xml");
//通过getElementByTagName(。。。)方法获取到节点列表
NodeList booklist = doc.getElementsByTagName("book");
System.out.println(booklist.getLength());
//通过for循环遍历每一个节点
for(int i = 0;i<booklist.getLength();i++) {
//得到每一个节点的属性和属性值
Node book = booklist.item(i);
NamedNodeMap attrs = book.getAttributes(); //得到了属性的集合
//循环遍历每一个属性
for(int j = 0;j<attrs.getLength();j++) {
Node id = attrs.item(j);
System.out.println("属性的名称:" + id.getNodeName() + "\t" + id.getNodeValue());
}
}
System.out.println("\n每一个节点的节点名和节点值");
//得到每一个节点的节点名和节点值
for(int i = 0;i<booklist.getLength();i++) {
//得到每一个book节点
Node book = booklist.item(i);
NodeList subnode = book.getChildNodes();
System.out.println("得到的子节点的个数: " + subnode.getLength());
for(int j = 0;j < subnode.getLength();j++) {
Node chNode = subnode.item(j);
// System.out.println(chNode.getNodeName() + "\t" );
short type = chNode.getNodeType(); //获取节点类型
if(type == Node.ELEMENT_NODE) {
System.out.println(chNode.getNodeName() + "\t" + chNode.getTextContent());
}
}
}
}
}
SAX解析XML
package sax;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class BookDefaultHandler extends DefaultHandler{
//重写第一个方法
/**解析xml文档开始时调用**/
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("解析xml文档开始");
}
/**解析xml文档结束时调用**/
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("解析xml文档结束");
}
/**解析xml文件中节点时调用**/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
System.out.println("解析xml文档节点开始时调用");
/*判断,如果是book节点的属性和属性值***/
if("book".equals(qName)) {
//】获取所有的属性
int count = attributes.getLength();
for(int i = 0;i<count;i++) {
String attName = attributes.getQName(i);//属性名称
String attValue = attributes.getValue(i);//属性值
System.out.println("属性名称:" + attName + "属性值:" + attValue);
}
}else {
if(!"books".equals(qName)&&!"book".equals(qName)) {
System.out.print("节点名称" + qName + "\t");
}
}
}
/**解析xml文档中节点结束时调用**/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
System.out.println("解析xml文档节点结束时调用");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
String value = new String(ch,start,length);
if(!"".equals(value.trim())) {
System.out.println(value);
}
}
}
package sax;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class TestSAXParse {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//1.创建SAXParserFactory的对象
SAXParserFactory spf = SAXParserFactory.newInstance();
//2.创建SAXParser对象(解析器)
SAXParser parser = spf.newSAXParser();
//3.创建一个DefaultHandler的子类
BookDefaultHandler bdh = new BookDefaultHandler();
//4.调用parse方法
parser.parse("book.xml", bdh);
}
}
JDOM方式解析XML:
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
public class TestJDOM {
public static void main(String[] args) throws FileNotFoundException, JDOMException, IOException {
//1.创建一个SAXBuilder对象
SAXBuilder sb = new SAXBuilder();
//2.调用builder方法添加Document对象(IO)
Document doc = sb.build(new FileInputStream("book.xml"));
//3.获取根节点
Element root = doc.getRootElement();
//获取根节点的子节点集合
List<Element> bookEle = root.getChildren();// book 两个book
//遍历集合,得到book的每一个子节点元素
for(int i = 0;i<bookEle.size();i++) {
Element book = bookEle.get(i);
//得到属性集合
List<Attribute> attList = book.getAttributes();
//遍历属性集合得到每一个元素
for(Attribute attr : attList) {
System.out.println(attr.getName() + "\t" + attr.getValue());
}
}
//得到每一个v子节点
System.out.println("\n***********************************");
for(int i = 0;i<bookEle.size();i++) {
Element book = bookEle.get(i);//锝到每一个book节点
List<Element> subBook = book.getChildren();
for (Element ele : subBook) {
System.out.println(ele.getName() + "\t" + ele.getValue());
}
System.out.println("***************************************");
}
}
}
DOM4J方式解析XML
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import entity.Book;
public class TestDOM4J {
public static void main(String[] args) {
//1.创建SAXReader对象
SAXReader reader = new SAXReader();
//2.调用read方法
Document doc = null;
try {
doc = reader.read(new File("book.xml"));
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//3.获取根元素
Element root = doc.getRootElement();
//4.通过迭代器遍历直接节点
for(Iterator<Element> itebook = root.elementIterator();itebook.hasNext();) {
Element bookEle = itebook.next();
// System.out.println(bookEle.getName());
//锝到book的属性
for(Iterator<Attribute> iteAtt = bookEle.attributeIterator();iteAtt.hasNext();) {
Attribute att = iteAtt.next();
System.out.println(att.getName() + "\t" + att.getValue());
}
}
//创建集合对象
List<Book> bookList = new ArrayList<Book>();
for(Iterator<Element> itebook = root.elementIterator();itebook.hasNext();) {
//创建book对象
Book book = new Book();
Element bookEle = itebook.next(); //锝到每一个book
//使用for循环继续便利
for(Iterator<Element> subBookEle = bookEle.elementIterator();subBookEle.hasNext();) {
//锝到每一个子元素
Element subEle = subBookEle.next();
System.out.println(subEle.getName() + "\t" + subEle.getText());
/**
*
*封装成book对象
*
* **/
//获取节点名称
String nodeName = subEle.getName();
//使用switch判断
switch (nodeName) {
case "name":
book.setName(subEle.getText());
break;
case "author":
book.setAuthor(subEle.getText());
break;
case "price":
book.setPrice(Double.parseDouble(subEle.getText()));
break;
}
}
bookList.add(book);
}
//遍历集合
System.out.println("\n集合遍历******************\n");
for(Book b : bookList) {
System.out.println(b.getName() + "\t" + b.getAuthor() + "\t" + b.getPrice());
}
}
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import entity.People;
public class TestWorker {
public static void main(String[] args) throws DocumentException {
//(1)SAXReader对象
SAXReader reader = new SAXReader();
//2.通过(1)的对象调用read方法
Document doc = reader.read("Worker.xml");
//3.获取根元素
Element root = doc.getRootElement();
//创建集合对象
List<People> peoList= new ArrayList<People>();
//4.通过迭代器遍历直接节点
for(Iterator<Element> subpeoList = root.elementIterator();subpeoList.hasNext();) {
People p = new People();
Element peoEle = subpeoList.next();
for(Iterator<Element> subPeopleEle = peoEle.elementIterator();subPeopleEle.hasNext();) {
//锝到每一个子元素
Element subEle = subPeopleEle.next();
String nodeName = subEle.getName();
//switch判断
switch (nodeName) {
case "工号":
p.setWorknumber(Integer.parseInt(subEle.getText()));
break;
case "姓名":
p.setName(subEle.getText());
break;
case "年龄":
p.setAge(Integer.parseInt(subEle.getText()));
break;
case "岗位":
p.setWork(subEle.getText());
break;
case "薪资":
p.setPay(Integer.parseInt(subEle.getText()));
break;
case "补助":
p.setSubsidy(Integer.parseInt(subEle.getText()));
break;
}
}
peoList.add(p);
}
//遍历集合
for (People people : peoList) {
System.out.println(people);
}
}
}
package Employe;
public class Employee {
private int num;
private String name;
private int age;
private String worker;
private int pay;
private int subsidy;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getWorker() {
return worker;
}
public void setWorker(String worker) {
this.worker = worker;
}
public int getPay() {
return pay;
}
public void setPay(int pay) {
this.pay = pay;
}
public int getSubsidy() {
return subsidy;
}
public void setSubsidy(int subsidy) {
this.subsidy = subsidy;
}
public Employee(int num, String name, int age, String worker, int pay, int subsidy) {
super();
this.num = num;
this.name = name;
this.age = age;
this.worker = worker;
this.pay = pay;
this.subsidy = subsidy;
}
public Employee() {
super();
}
@Override
public String toString() {
return "Employee [num=" + num + ", name=" + name + ", age=" + age + ", worker=" + worker + ", pay=" + pay
+ ", subsidy=" + subsidy + "]";
}
}
package Employe;
import java.awt.List;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Test4jdom {
public static void main(String[] args) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("Worker.xml"));
Element root = doc.getRootElement();
for(Iterator<Element> ite = root.elementIterator();ite.hasNext();) {
Element workEle = ite.next();
// System.out.println(workEle.getName());
//得到work的属性
for(Iterator<Attribute> iteAtt = workEle.attributeIterator();iteAtt.hasNext();) {
Attribute att = iteAtt.next();
System.out.println(att.getName() + "\t" + att.getValue());
}
}
ArrayList<Employee> list = new ArrayList<Employee>();
System.out.println("***********************************");
for(Iterator<Element> iteWork= root.elementIterator();iteWork.hasNext();) {
Class c = Class.forName("Employe.Employee");
Constructor cons = c.getConstructor(null);
Employee employee = (Employee)cons.newInstance();
Element workEle=iteWork.next();
for(Iterator<Element> subWorkEle = workEle.elementIterator();subWorkEle.hasNext();) {
Element subEle = subWorkEle.next();
System.out.println(subEle.getName() + "\t" + subEle.getText());
switch (subEle.getName()){
case "姓名":
employee.setName(subEle.getText());
break;
case "年龄":
employee.setAge(Integer.parseInt(subEle.getText()));
break;
case "岗位":
employee.setWorker(subEle.getText());
break;
case "薪资":
employee.setPay(Integer.parseInt(subEle.getText()));
break;
case "补助":
employee.setSubsidy(Integer.parseInt(subEle.getText()));
break;
}
}
list.add(employee);
System.out.println("----------------------------------------");
}
for (Employee employee : list) {
System.out.println(employee);
}
}
}
package entity;
public class Book {
private String name;
private String author;
private double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Book(String name, String author, double price) {
super();
this.name = name;
this.author = author;
this.price = price;
}
public Book() {
super();
}
}
package entity;
public class People {
private Integer worknumber;
private String name;
private Integer age;
private String work;
private Integer pay;
private Integer subsidy;
public Integer getWorknumber() {
return worknumber;
}
public void setWorknumber(Integer worknumber) {
this.worknumber = worknumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getWork() {
return work;
}
public void setWork(String work) {
this.work = work;
}
public Integer getPay() {
return pay;
}
public void setPay(Integer pay) {
this.pay = pay;
}
public Integer getSubsidy() {
return subsidy;
}
public void setSubsidy(Integer subsidy) {
this.subsidy = subsidy;
}
public People(Integer worknumber, String name, Integer age, String work, Integer pay, Integer subsidy) {
super();
this.worknumber = worknumber;
this.name = name;
this.age = age;
this.work = work;
this.pay = pay;
this.subsidy = subsidy;
}
public People() {
super();
}
@Override
public String toString() {
return " worker | 工号 |" + worknumber + "| 姓名 |" + name +"| 年龄 |" + age + "| 岗位 |" + work + "| 薪资 |" + pay + "| 补助 |"
+ subsidy + " |";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1001">
<name>java开发实战</name>
<author>张小三</author>
<price>98.5</price>
</book>
<book id="1002">
<name>mysql从删库到跑路</name>
<author>王一一</author>
<price>89.7</price>
</book>
</books>
<?xml version="1.0" encoding="UTF-8"?>
<工号>
<工号 id = "1001">
<姓名>高淇</姓名>
<年龄>18</年龄>
<岗位>程序员</岗位>
<薪资>30000</薪资>
<补助>5000</补助>
</工号>
<工号 id = "1002">
<姓名>高小二</姓名>
<年龄>19</年龄>
<岗位>讲师</岗位>
<薪资>35000</薪资>
<补助>2000</补助>
</工号>
<工号 id = "1003">
<姓名>高小松</姓名>
<年龄>20</年龄>
<岗位>教授</岗位>
<薪资>20000</薪资>
<补助>3000</补助>
</工号>
</工号>