目录
一、XML文件
student.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 内嵌 -->
<!DOCTYPE students
[
<!ELEMENT students (student*)>
<!ELEMENT student (name,age,gender)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT gender (#PCDATA)>
<!ATTLIST student
id ID #REQUIRED
sex (male|female) #REQUIRED
pid IDREFS #REQUIRED
>
]
>
<students>
<student id="a1" sex="male" pid="a1 a2">
<name>Tom</name>
<age>20</age>
<gender>male</gender>
</student>
<student id="a2" sex="male" pid="a1">
<name>Bob</name>
<age>20</age>
<gender>male</gender>
</student>
</students>
二、DOM解析
/**
* 使用dom解析xml文件
*
* @param path xml文件路径
*
* @throws Exception
*/
public static void domParse(String path) throws Exception {
// 1.创建解析器的工厂类
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2.创建解析器对象
DocumentBuilder documentBuilder = factory.newDocumentBuilder();
// 3.解析文件获取文档对象
Document document = documentBuilder.parse(path);
// 4.获取文档根节点
Element root = document.getDocumentElement();
System.out.println("<" + root.getNodeName() + ">");
// 5.获取根节点下面的所有子节点
NodeList firstList = root.getChildNodes();
for (int i = 0; i < firstList.getLength(); i++) {
// node对应每一个节点,一级节点,下面包含很多二级节点
Node node = firstList.item(i);
// System.out.println("一级节点:"+node.getNodeName());
// 取每一个结点的属性值
// NamedNodeMap attributes = node.getAttributes();
// if (attributes != null && attributes.getLength() != 0) {
// for (int j = 0; j < attributes.getLength(); j++) {
// // 对于每个属性
// Node item = attributes.item(j);
// // System.out.println(item.getNodeName() +"----"+ item.getNodeType());
// }
// }
System.out.println("\t<" + node.getNodeName() + " " + node.getAttributes().item(0).getNodeName() + "='"
+ node.getAttributes().item(0).getTextContent() + "' " + node.getAttributes().item(1).getNodeName()
+ "='" + node.getAttributes().item(1).getTextContent() + "' "
+ node.getAttributes().item(2).getNodeName() + "='" + node.getAttributes().item(2).getTextContent()
+ "'>");
// 取出所有二级节点
NodeList secondList = node.getChildNodes();
for (int j = 0; j < secondList.getLength(); j++) {
// 取出每一个二级节点
Node item = secondList.item(j);
// System.out.println("二级节点:"+item.getNodeName());
System.out.println(
"\t\t<" + item.getNodeName() + ">" + item.getTextContent() + "</" + item.getNodeName() + ">");
}
System.out.println("\t</" + node.getNodeName() + ">");
}
System.out.println("</" + root.getNodeName() + ">");
}
/**
* 写xml格式的内容到文件
*
* @param path
* 文件路径
* @throws Exception
**/
public static void domWriter(String path) throws Exception {
// 1.创建解析器对象工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
// 2.创建解析器对象
DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
// 3.构建文档对象
Document dom = documentBuilder.newDocument();
// 4.创建根节点
Element root = dom.createElement("students");
// 5.创建其他节点
Element firstNode = dom.createElement("student");
// 二级节点:name:Tom
Element nameNode = dom.createElement("name");
nameNode.setTextContent("Tom");
// 二级节点:age:20
Element ageNode = dom.createElement("age");
ageNode.setTextContent("20");
// 二级节点:gender:male
Element genderNode = dom.createElement("gender");
genderNode.setTextContent("male");
Element secondNode = dom.createElement("student");
// 二级节点:name:Bob
Element nameNode1 = dom.createElement("name");
nameNode1.setTextContent("Bob");
// 二级节点:age:18
Element ageNode1 = dom.createElement("age");
ageNode1.setTextContent("18");
// 二级节点:gender:female
Element genderNode1 = dom.createElement("gender");
genderNode1.setTextContent("female");
// 进行结点关联
// 关联根节点
dom.appendChild(root);
// 关联一级节点
root.appendChild(firstNode);
root.appendChild(secondNode);
// 关联二级节点
firstNode.appendChild(nameNode);
firstNode.appendChild(ageNode);
firstNode.appendChild(genderNode);
secondNode.appendChild(nameNode1);
secondNode.appendChild(ageNode1);
secondNode.appendChild(genderNode1);
//创建转化器对象工厂
TransformerFactory factory = TransformerFactory.newInstance();
//创建转化器对象
Transformer transformer = factory.newTransformer();
//执行转化方法
transformer.transform(new DOMSource(dom), new StreamResult(new File(path)));
}
三、SAX解析
/**
* SAX解析xml文件的方法
*
* @param path
* 需要解析的xml文件的路径
* @throws Exception
*/
public static void saxParse(String path) throws Exception {
//1.构建SAX解析器工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//2.构建解析器对象
SAXParser saxParser = saxParserFactory.newSAXParser();
//3.调用方法解析xml文件
//parse(文件对象(或流),自定义事件处理器)
// saxParser.parse(new FileInputStream(path), dh);
saxParser.parse(new File(path),new MyHandler());
}
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MyHandler extends DefaultHandler {
/**
* 开始读取文档
*/
@Override
public void startDocument() throws SAXException {
// System.out.println("开始读取文档:startDocument()");
}
/**
* 文档读取结束
*/
@Override
public void endDocument() throws SAXException {
// System.out.println("文档读取结束:endDocument()");
}
/**
* 开始读取元素时调用
* @param uri
* @param localName
* @param qName
* @throws SAXException
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// System.out.println("开始读取元素:startElement()");
// System.out.println(uri);
// System.out.println(localName);
// System.out.println(qName);
// System.out.println(attributes.getIndex(qName));
//取属性
/*for (int i = 0; i < attributes.getLength(); i++) {
String qName2 = attributes.getQName(i);
String value = attributes.getValue(i);
System.out.println(qName2+"--"+value);
}*/
System.out.print("<"+qName);
for (int i = 0; i < attributes.getLength(); i++) {
String qName2 = attributes.getQName(i);
String value = attributes.getValue(i);
System.out.print(" "+qName2+"=\""+value+"\"");
}
System.out.print(">");
}
/**
* 结束读取元素
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// System.out.println("结束读取元素:endElement()");
// System.out.println(qName);
System.out.println("</"+qName+">");
}
/**
* 读取到元素值时
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// System.out.println("读取到元素值时:characters()");
for (int i = 0; i < ch.length; i++) {
//元素值:[start,start+length)
if(i>=start&&i<start+length) {
System.out.print(ch[i]);//结果:Tom20maleBob20male
}
}
}
}
四、dom4j解析
/**
* dom4j解析xml文件
*
* @param path
* 需要解析的xml文件
* @throws Exception
*/
public static void dom4j(String path) throws Exception {
// System.out.println(path);
// 1.构建解析器
SAXReader sr = new SAXReader();
// 2.调用方法解析文件
Document document = sr.read(new File(path));
// 3.获取根节点
Element root = document.getRootElement();
System.out.println("<" + root.getName() + ">");
// 4.获取一级节点集合,一级节点下面包含很多二级节点
List<Element> elements = root.elements();
for (Element element : elements) {
System.out.print("\t" + "<" + element.getName() + " ");
// 获取一级节点属性
List<Attribute> attr = element.attributes();
for (Attribute attribute : attr) {
System.out.print(attribute.getName() + "=\"" + attribute.getText() + " ");
}
System.out.println(">");
// 获取二级节点
List<Element> e = element.elements();
for (Element e1 : e) {
System.out.println("\t\t" + "<" + e1.getName() + ">" + e1.getText() + "</" + e1.getName() + ">");
}
// 一级节点结束标签
System.out.println("\t" + "</" + element.getName() + ">");
}
System.out.println("</" + root.getName() + ">");
}
/**
* dom4j写数据到xml文件
*
* @param xmlPath
* xml文件路径
* @throws Exception
*/
public static void dom4jWriter(String xmlPath) throws Exception {
// 1.创建一个document对象
Document document = DocumentHelper.createDocument();
// 2.创建根结点
Element root = document.addElement("employees");
// 3.创建一级节点
Element firstNode1 = root.addElement("employee");
Element firstNode2 = root.addElement("employee");
// 创建一级标签属性
firstNode1.setAttributeValue("status", "在职");
firstNode2.setAttributeValue("status", "离职");
// 4.创建二级节点
Element idNode1 = firstNode1.addElement("id");
Element nameNode1 = firstNode1.addElement("name");
Element ageNode1 = firstNode1.addElement("age");
Element depNameNode1 = firstNode1.addElement("depName");
Element idNode2 = firstNode2.addElement("id");
Element nameNode2 = firstNode2.addElement("name");
Element ageNode2 = firstNode2.addElement("age");
Element depNameNode2 = firstNode2.addElement("depName");
// 设置二级节点的值
idNode1.setText("A12");
nameNode1.setText("张三");
ageNode1.setText("18");
depNameNode1.setText("教学部");
idNode2.setText("A13");
nameNode2.setText("李四");
ageNode2.setText("23");
depNameNode2.setText("MIS部");
// 5.写到文件
// 格式化对象
OutputFormat format = OutputFormat.createPrettyPrint();
File file = new File(xmlPath);
if (!file.exists()) {
file.createNewFile();
}
// 格式化
// XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(file),format);
// 非格式化
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(file));
xmlWriter.write(document);
xmlWriter.flush();
xmlWriter.close();
}