JAVA自带的两种解析方式
一、DOM
1、DOM解析xml文件
首先创建一个xml文件
<?xml version="1.0"?>
<students>
<student id="1">
<name>小民</name>
<age>93</age>
</student>
<student id="2">
<name>小泽</name>
<age>13</age>
</student>
</students>
DOM常用结点类型
节点类型 | NodeType | nodeName返回值 | nodeValue返回值 |
---|---|---|---|
Element | 1 | element name | null |
Attr | 2 | 属性名称 | 属性值 |
text | 3 | #text | 结点内容 |
public class DOMtest {
public static void main(String args[]){
//1、创建一个DocumentBuilderFactory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
//2、创建一个DocumentBuilder
DocumentBuilder Builder = dbf.newDocumentBuilder();
//3、使用DocumentBuilder对象的parse方法
Document document = Builder.parse("src/XMLtest/test/student.xml");
//parse方法可以传入uri、File对象、InputStream对象、InputSource
//直接获取student标签
NodeList nodeList = document.getElementsByTagName("student");
for (int i = 0,len=nodeList.getLength(); i < len; i++) {
Node n = nodeList.item(i);
//获取结点的属性集合
NamedNodeMap nnm = n.getAttributes();
for (int i1 = 0; i1 < nnm.getLength(); i1++) {
Node attr = nnm.item(i1);
//输出结点的属性名和属性值
System.out.print(attr.getNodeName()+"="+attr.getNodeValue()+" ");
}
//这里获取的childnode包括换行的#text结点
NodeList childNodes = n.getChildNodes();
for (int i1 = 0; i1 < childNodes.getLength(); i1++){
Node cn =childNodes.item(i1);
//这里要判断是否为ELEMENT_NODE结点
if(cn.getNodeType()== Node.ELEMENT_NODE){
System.out.println(cn.getNodeName()+cn.getTextContent());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果
2、DOM创建xml文件
public static void main(String args[]){
//创建xml文件
//1、创建一个DocumentBuilderFactory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
//2、创建一个DocumentBuilder
DocumentBuilder db = dbf.newDocumentBuilder();
//3、使用newDocument方法创建新的document
Document document = db.newDocument();
document.setXmlStandalone(true); //不显示standalone
//创建students element
Element students = document.createElement("students");
document.appendChild(students);
Element student = document.createElement("student");
student.setAttribute("id","1");
Element name = document.createElement("name");
name.setTextContent("小民");
student.appendChild(name);
students.appendChild(student);
//储存xml文件
//1、创建TransformerFactory对象
TransformerFactory tff = TransformerFactory.newInstance();
//2、创建Transformer
Transformer transformer = tff.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT,"yes"); //是否换行
transformer.setOutputProperty(OutputKeys.ENCODING,"utf-8");//设置编码
//调用transform(Source xmlSource, Result outputTarget)
transformer.transform(new DOMSource(document),new StreamResult(new File("DOM_student.xml")));
} catch (Exception e) {
e.printStackTrace();
}
}
二、SAX
1、SAX解析xml文件
首先创建SAXparserHandle类继承DefaultHandler用于解析xml
public class SAXparserHandle extends DefaultHandler {
private String value = null;
//接收文档开始
@Override
public void startDocument() throws SAXException {
System.out.println("SAX解析开始");
super.startDocument();
}
//接收文档结束
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("SAX解析结束");
}
//接收element开始 uri和localName均为Namespace的属性
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//如果当前element的qName为student则输出他的属性
if (qName.equals("student")){
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println(attributes.getQName(i)+"="+attributes.getValue(i));
}
}
}
//接收element结束
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
//由于一个标签内的text在标签之中所以要在此标签结束后读取text
if (qName.equals("name")){
System.out.println("name"+":"+value);
}else if (qName.equals("age")){
System.out.println("age"+":"+value);
}
}
//接收element内字符数据
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
//记录读取到的数据
value = new String(ch,start,length);
}
}
public class SAXtest {
public static void main(String args[]) {
//1、创建SAXParserFactory对象
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
//2、创建SAXParser对象
SAXParser saxParser = factory.newSAXParser();
//3、创建一个Handle用于解析xml 需要自己创建类
SAXparserHandle handle = new SAXparserHandle();
//4、调用parse方法
saxParser.parse("src/XMLtest/test/student.xml",handle);
} catch (Exception e) {
e.printStackTrace();
}
}
}
解析结果
2、SAX创建xml文件
public class SAXtest {
public static void main(String args[]) {
//1、创建SAXTransformerFactory对象
SAXTransformerFactory stff = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
try {
//2、创建TransformerHandler
TransformerHandler tfh = stff.newTransformerHandler();
//3、设置TransformerHandler的一些属性
Transformer tr = tfh.getTransformer();
tr.setOutputProperty(OutputKeys.ENCODING,"utf-8");
//是否换行
tr.setOutputProperty(OutputKeys.INDENT,"yes");
Result result = new StreamResult(new FileOutputStream("SAX_student.xml"));
//设置输出要在开始Document之前设置
tfh.setResult(result);
//开始创建Document
tfh.startDocument();
//AttributesImpl用于创建element的属性
AttributesImpl att = new AttributesImpl();
tfh.startElement("","","students",att);
att.clear();
att.addAttribute("","","id","","1");
//student元素开始
tfh.startElement("","","student",att);
att.clear();
//name元素开始
tfh.startElement("","","name",att);
tfh.characters("小民".toCharArray(),0,"小民".length());
tfh.endElement("","","name");
//age元素开始
tfh.startElement("","","age",att);
tfh.characters("93".toCharArray(),0,"93".length());
tfh.endElement("","","age");
//student元素结束
tfh.endElement("","","student");
tfh.endElement("","","students");
tfh.endDocument();
} catch (Exception e) {
e.printStackTrace();
}
}
}
生成文件