XML解析方式
XML解析的方式一般分为俩种:
DOM解析
SAX解析
简单写一下这两个解析的解析代码
如有对DOM解析和SAX解析不理解的可以下方评论。分享一些干货给你们对
cd.xml
文件的解析
cd.xml
<?xml version="1.0" encoding="UTF-8"?>
<cds>
<cd id="x112">
<name>周杰伦</name>
<price>155.5</price>
<title>七里香</title>
</cd>
<cd id="x113">
<name>林俊杰</name>
<price>156.1</price>
<title>江南</title>
</cd>
<cd id="x114">
<name>蔡依林</name>
<price>155.65</price>
<title>呸</title>
</cd>
<cd id="x115">
<name>蔡徐坤</name>
<price>15.61</price>
<title>篮球</title>
</cd>
<cd id="x116">
<name>毛不易</name>
<price>156.1</price>
<title>入海</title>
</cd>
</cds>
DOM解析:
JAXP中的DOM解析的步骤:
调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂
调用工厂对象的 newDocumentBuilder 方法得到 DOM 解析器对象
调用 DOM 解析器对象的 parse() 方法解析 XML 文档parse() 方法会返回解析得到的 Document 对象
然后根据根据文档的结构关系和特点,调用相应的API,对其进行解析
public static void main(String[] args) throws Exception {
//获取解析工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//从解析工厂获取解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//获取document对象
Document document = builder.parse("src/com/briup/day6/cd.xml");
//获取根节点
Element root = document.getDocumentElement();
System.out.println("根节点为:" + root.getNodeName());
//获取所有子节点
NodeList list = root.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
//筛选掉文本节点
if (node.getNodeType() == Node.ELEMENT_NODE) {
//获取当前节点的所有属性
NamedNodeMap map = node.getAttributes();
for (int j = 0; j < map.getLength(); j++) {
Node item = map.item(j);
System.out.println(item.getNodeName() + ":" + item.getNodeValue());
//获取当前节点的子节点
NodeList list2 = node.getChildNodes();
for (int k = 0; k < list2.getLength(); k++) {
Node item2 = list2.item(k);
if(item2.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(item2.getNodeName() + ":" + item2.getTextContent());
}
}
}
}
}
}
SAX解析:
在基于SAX解析的程序中,有五个最常用SAX事件:
startDocument() , 解析器发现了文档的开始标签,会自动调用该方法
endDocument() , 解析器发现了文档结束标签,会自动调用该方法
startElement() , 解析器发现了一个起始标签 ,会自动调用该方法
character() , 解析器发现了标签里面的文本值,会自动调用该方法
endElement() , 解析器发现了一个结束标签,会自动调用该方法
JAXP中的SAX解析的步骤:
获取SAXParserFactory工厂类对象, SAXParserFactory.newInstance()
使用工厂对象,创建出SAX解析器, saxParserFactory.newSAXParser()
调用解析器的 parse() 解析xml文件,然后重写DefaultHandler类中的方法,进行事件处理
saxParser.parse(filePath, new DefaultHandler(){…}
public static void main(String[] args) throws Exception, SAXException {
//获取解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//获取解析器
SAXParser saxParser = factory.newSAXParser();
//开始解析
saxParser.parse("src/com/briup/day6/cd.xml", new DefaultHandler() {
@Override
public void startDocument() throws SAXException {
System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
StringBuffer sb = new StringBuffer();
sb.append("<").append(qName);
for (int i = 0; i < attributes.getLength(); i++) {
sb.append(" ")
.append(attributes.getQName(i))
.append("=")
.append("\"")
.append(attributes.getValue(i))
.append("\"");
}
sb.append(">");
System.out.print(sb);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
StringBuffer sb = new StringBuffer();
sb.append("</")
.append(qName)
.append(">");
System.out.print(sb);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.print(new String(ch, start, length));
}
});
}
DOM4J解析:
使用第三方jar。如有需要可在下方评论。
Dom4j 是一个Java的XML API,用来读写XML文件的,它是一个十分优秀的Java XML API,具有性能 优异、功能强大和极其易使用的特点,且开源免费。
public static void main(String[] args) throws Exception {
SAXReader sr = new SAXReader();
//获取document对象
Document document = sr.read("src/com/briup/day6/cd.xml");
//获取根节点
Element root = document.getRootElement();
System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
String name = root.getName();
StringBuffer sb = new StringBuffer();
sb.append("<").append(name).append(">").append("\n");
//获取所有子节点
List<Element> list = root.elements();
for (int i = 0; i < list.size(); i++) {
List<Attribute> attributes = list.get(i).attributes();
for (int j = 0; j < attributes.size(); j++) {
sb.append(" <")
.append(list.get(i).getName())
.append(" ")
.append(attributes.get(j).getName())
.append("=")
.append("\"")
.append(attributes.get(j).getValue())
.append("\"")
.append(">")
.append("\n");
List<Element> list2 = list.get(i).elements();
for (int k = 0; k < list2.size(); k++) {
sb.append(" <")
.append(list2.get(k).getName())
.append(">")
.append(list2.get(k).getText())
.append("</")
.append(list2.get(k).getName())
.append(">")
.append("\n");
}
sb.append(" <")
.append(list.get(i).getName())
.append("/>")
.append("\n");
}
}
System.out.println(sb.append("</").append(name).append(">").append("\n"));
}