第一原生的解析方式 DOM
解析器在解析XML文档的时候 会把文档内容写入到内存中 如果实现了文档节点的增删改后 就必须运用
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult("src/dom4f.xml"));同步到本地文档中
new DOMSource(doc) 是被加载进内存中的数据、
new StreamResult("src/dom4f.xml")); 将要被写入的结果流
创建一个xml文档
<?xml version="1.0" encoding="UTF-8"?>
<图书馆>
<书架 id="003">
<书>
<书名>钢铁是怎样练成的</书名>
<会员价>15.8</会员价>
<作者>特洛夫斯基</作者>
<出版社>人民日报</出版社>
<会员价>10.0</会员价>
</书>
<书>
<书名>红楼梦</书名>
<作者>曹雪芹</作者>
<出版社>修补匠</出版社>
<价格>18.8</价格>
</书>
</书架>
<书架 id="002">
<书>
<书名>钢铁是怎样练成的11</书名>
<会员价>15.81</会员价>
<作者>特洛夫斯基1</作者>
<出版社>人民日报1</出版社>
</书>
<书>
<书名>红楼梦1</书名>
<作者>曹雪芹1</作者>
<出版社>修补匠1</出版社>
<价格>18.81</价格>
</书>
</书架>
</图书馆>
package dom;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Demo {
@Test
public void myTest_Dom() throws Exception {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse("src/dom4f.xml");
// Node node1= doc.getElementsByTagName("作者").item(0);
// String content = node1.getTextContent();
// System.out.println(content);
// Element newElement = doc.createElement("价格");
// newElement.setTextContent("18.8");
// Node secondNode = doc.getElementsByTagName("书").item(1);
// Node node = secondNode.appendChild(newElement);
//
// Transformer tran = TransformerFactory.newInstance().newTransformer();
// tran.transform(new DOMSource(doc), new StreamResult("src/dom4f.xml"));
//myTest2(doc);
// myTest4(doc);
// myTest5(doc);
// myTest6(doc);
myTest7(doc);
System.out.println("=========");
}
private void myTest2(Node node) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
NodeList childNodes = node.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
myTest2(childNodes.item(i));
}
// TODO Auto-generated method stub
}
private void myTest4(Document doc) throws Exception {
Element newElement = doc.createElement("会员价");
newElement.setTextContent("15.8");
Node author = doc.getElementsByTagName("书").item(0);
author.getParentNode().insertBefore(newElement, author);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult("src/dom4f.xml"));
}
private void myTest5(Document doc) throws Exception {
Node publisher = doc.getElementsByTagName("书").item(1);
publisher.getParentNode().removeChild(publisher);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult("src/dom4f.xml"));
}
/*private void myTest6(Document doc) throws Exception {
Element element = (Element)doc.getElementsByTagName("会员价").item(0)ֵ;
element.setTextContent("19.8");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult("src/dom4f.xml"));
}*/
private void myTest7(Document doc) throws Exception {
Element element = (Element)doc.getElementsByTagName("ͼ���").item(0);
element.setAttribute("地址","安徽合肥");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult("src/book.xml"));
}
}
第二种方式 SAX 的解析是根据事件的触发而执行的
package SAX_text;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class Text {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
File file=new File("src/dom4f.xml");
saxParser.parse(file, new myHandler());
}
}
class myHandler extends DefaultHandler{
private boolean isExits=false;
int i=0;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if ("书名".equals(qName)) {
// System.out.println(qName);
isExits=true;
i++;
}
// System.out.println(qName);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
isExits=false;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (isExits&&i==2) {
System.out.println(new String(ch,start,length));
}
}
}
第三种方式 DOM4J 基于SAX
package dom4j_text;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Text {
public static void main(String[] args) throws DocumentException, IOException {
File file=new File("src/dom4f.xml");
SAXReader saxReader=new SAXReader();
Document doc = saxReader.read(file);
Element root = doc.getRootElement();
/*// System.out.println(root+"111111111111");
Element element = root.element("书架");
// System.out.println(element);
List list1 = root.elements();
// System.out.println(list1);
List list2 = element.elements();
// System.out.println(list2);
Iterator iterator = list2.iterator();
while (iterator.hasNext()) {
Element element2 = (Element)iterator.next();
System.out.println(element2.getName());
}
*/
//修改书架的id为id
/* Attribute attribute = root.element("书架").attribute("id");
attribute.setValue("003");
FileWriter writer=new FileWriter(file);
doc.write(writer);
writer.close();*/
//可以设置显示样式 也可以设置编码格式
// OutputFormat sFormat=OutputFormat.createPrettyPrint();
// sFormat.setEncoding("UTF-8");
//在003的书架上的第二本书加会员价
/*List<Element> list = root.selectNodes("书架[@id=003]/书");
System.out.println(list.size());
Element element = list.get(0);
Element addElement = element.addElement("会员价");
addElement.addText("10.0");
XMLWriter writer=new XMLWriter(new FileWriter(file));
writer.write(doc);
writer.close();
*/
Node node = root.selectSingleNode("书架[@id=003]/书[2]");
System.out.println(node.getText());
}
}