DOM解析XML
student.xml
- <?xml version="1.0" encoding="UTF-8" standalone="no"?><exam>
- <student examid="222" idcard="111">
- <name>newValue</name>
- <location>沈阳</location>
- <grade>89</grade>
- </student>
- <student examid="444" idcard="333">
- <name>newValue</name>
- <location>大连</location>
- <grade>97</grade>
- </student>
- </exam>
testadmin.java
- package com.dwt1220;
- import java.io.FileOutputStream;
- 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.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.Node;
- import org.w3c.dom.NodeList;
- public class testadmin {
- public static void main(String[] args) throws Exception {
- /**************************** 创建Document类 *********************************************/
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- DocumentBuilder builder = factory.newDocumentBuilder();
- Document document = builder.parse("./src/student.xml");
- /**************************** 添加student节点
- *********************************************/
- /**
- * ①创建节点
- * ②设置节点的值(包括属性)
- * ③获得节点插入的位置
- * ④插入节点
- * ⑤更新文件
- */
- /**①创建节点*/
- /************ 创建student节点 **********/
- Element studentElement = document.createElement("student");
- /************ 创建name,location,grade节点 **********/
- Element nameElement = document.createElement("name");
- Element locationElement = document.createElement("location");
- Element gradeElement = document.createElement("grade");
- /**②设置节点的值(包括属性)*/
- /************ 设置name,location,grade节点的值 ******/
- nameElement.setTextContent("nameValue");
- locationElement.setTextContent("locationValue");
- gradeElement.setTextContent("gradeValue");
- /************ 设置student节点的属性*******/
- studentElement.setAttribute("examid", "value");
- studentElement.setAttribute("idcard", "value");
- /**③获得节点插入的位置*/
- /************ 获得XML的根节点 ******/
- Node rootNode = document.getElementsByTagName("exam").item(0);
- /**④插入节点*/
- /************ 把student节点添加到根节点下 ******/
- rootNode.appendChild(studentElement);
- /************ 把name,locationt,gradet节点添加到student节点下 ******/
- studentElement.appendChild(nameElement);
- studentElement.appendChild(locationElement);
- studentElement.appendChild(gradeElement);
- /**⑤更新文件*/
- TransformerFactory transformerFactory =
- TransformerFactory.newInstance();
- Transformer tf = transformerFactory.newTransformer();
- tf.transform(new DOMSource(document), new StreamResult(
- new FileOutputStream("./src/student.xml")));
- // /**************************** 修改name节点
- // *********************************************/
- // /**
- // * 把name值为nameValue修改成newValue
- // * ① 获得name节点的list
- // * ②查找内容相符的name节点
- // * ③修改节点内容
- // * ④更新文件
- // */
- // String updataValue = "nameValue";
- //
- // /************ ① 获得需要修改的节点 **************/
- // NodeList nameNodeList = document.getElementsByTagName("name");
- //
- // /************ ②查找内容相符的节点 **************/
- // for (int i = 0; i < nameNodeList.getLength(); i++) {
- //
- // /************ ③修改节点内容 **************/
- // if (updataValue.equals(nameNodeList.item(i).getTextContent()))
- // nameNodeList.item(i).setTextContent("newValue");
- // }
- //
- // /** ④更新文件 */
- // TransformerFactory transformerFactory = TransformerFactory
- // .newInstance();
- // Transformer tf = transformerFactory.newTransformer();
- // tf.transform(new DOMSource(document), new StreamResult(
- // new FileOutputStream("./src/student.xml")));
- // /**************************** 删除节点or替换节点
- // *********************************************/
- // /***
- // * 把name值为nameValue的Student节点删除
- // * ① 获得name节点的list
- // * ②查找内容相符的name节点
- // * ③获得name的Student父节点, 从Student的父节点删除student
- // * ④更新文件
- // */
- // String delaValue = "nameValue";
- //
- // /************ ① 获得name节点的list **************/
- // NodeList nameNodeList = document.getElementsByTagName("name");
- //
- // /************ ②查找内容相符的name节点 **************/
- // for (int i = 0; i < nameNodeList.getLength(); i++) {
- // if (delaValue.equals(nameNodeList.item(i).getTextContent())) {
- // /************ ③获得name的Student父节点,从Student的父节点删除student
- // **************/
- // nameNodeList.item(i).getParentNode().getParentNode()
- // .removeChild(nameNodeList.item(i).getParentNode());
- // /*******如果要替换节点用.replaceChild(newChild, oldChild)方法************/
- // }
- // }
- //
- // /** ④更新文件 */
- // TransformerFactory transformerFactory = TransformerFactory
- // .newInstance();
- // Transformer tf = transformerFactory.newTransformer();
- // tf.transform(new DOMSource(document), new StreamResult(
- // new FileOutputStream("./src/student.xml")));
- // /************** 解析xml ************************/
- // /****获得根节点*****/
- // Element rootElement = document.getDocumentElement();
- // /****获得所有student节点****/
- // NodeList studentNodeList =
- // rootElement.getElementsByTagName("student");
- //
- // /****打印student的节点名,和值****/
- // for (int i = 0; i < studentNodeList.getLength(); i++) {
- // System.out.println("studentNodeitem("+"i): "+studentNodeList.item(i).getNodeName());
- //
- // /****获得所有student下的所有子节点****/
- // NodeList studentChildNodeList =
- // studentNodeList.item(i).getChildNodes();
- //
- // /****打印student下的所有字节点的,节点名 和值 ※回车算一个字text节点****/
- // for(int j=0;j<studentChildNodeList.getLength();j++){
- // System.out.println(studentChildNodeList.item(j).getNodeName()+" "+studentChildNodeList.item(j).getTextContent());
- // }
- //
- // }
- }
- }
※回车算一个字text节点
※修改完XML文件一定要更新内存
SAX解析
test.xml
- <?xml version="1.0" encoding="UTF-8" standalone="no"?><exam>
- <student examid="222" idcard="111">
- <name>张三</name>
- <location>沈阳</location>
- <grade>89</grade>
- </student>
- <student examid="444" idcard="333">
- <name>李四</name>
- <location>大连</location>
- <grade>97</grade>
- </student>
- </exam>
testadmin.java
- package com.dwt1220;
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.parsers.SAXParser;
- import javax.xml.parsers.SAXParserFactory;
- import org.xml.sax.Attributes;
- import org.xml.sax.ContentHandler;
- import org.xml.sax.Locator;
- import org.xml.sax.XMLReader;
- import org.xml.sax.helpers.DefaultHandler;
- import org.xml.sax.SAXException;
- import sun.security.smartcardio.SunPCSC.Factory;
- import java.util.Properties;
- public class testadmin extends DefaultHandler {
- public static void main(String[] args) throws Exception {
- /**
- * 1.创建解析工厂 SAXParserFactory 2.得到解析器 SAXParser 3.得到读取器 XMLReader
- * 4.设置内容处理 xMLReader.setContentHandler(handler)
- * 传入一个继承了ContentHandler,并重写了其中方法的类 (一般继承实现了ContentHandler,
- * DefaultHandler类) 5.读取xml文档内容
- */
- /******************** 1.创建解析工厂 *************************/
- SAXParserFactory factory = SAXParserFactory.newInstance();
- /******************** 2.得到解析器 *************************/
- SAXParser sp = factory.newSAXParser();
- /******************** 3.得到读取器 *************************/
- XMLReader reader = sp.getXMLReader();
- /******ListHandler得到xml文档所有内容
- * TagValueHandler得到xml文档指定内容 *************************/
- ContentHandler handler = new TagValueHandler();
- /******************** 4.设置内容处理 *************************/
- reader.setContentHandler(handler);
- /******************** 5.读取xml文档内容 *************************/
- reader.parse("src/test.xml");
- }
- }
- /******* 得到xml文档所有内容 ************/
- class ListHandler extends DefaultHandler {
- @Override
- public void startDocument() throws SAXException {
- System.out.println("startDocument");
- }
- @Override
- public void endDocument() throws SAXException {
- System.out.println("endDocument");
- }
- @Override
- public void startElement(String uri, String localName, String qName,
- Attributes attributes) throws SAXException {
- /**
- * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 localName -
- * 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 qName-标签名 attributes-属性,
- * attributes.getQName(i)提前属性名 etValue(i)提取属性值
- */
- System.out.print("<" + qName + " ");
- for (int i = 0; attributes != null && i < attributes.getLength(); i++) {
- System.out.print(attributes.getQName(i) + "=\""
- + attributes.getValue(i) + "\" ");
- }
- System.out.println(">");
- }
- @Override
- public void endElement(String uri, String localName, String qName)
- throws SAXException {
- System.out.println("</" + qName + ">");
- }
- @Override
- public void characters(char[] ch, int start, int length)
- throws SAXException {
- /**
- * ch - 字符 start - 字符数组中的开始位置 length - 从字符数组中使用的字符数。
- */
- System.out.println(new String(ch, start, length));
- }
- }
- /******* 得到xml文档指定内容 ************/
- class TagValueHandler extends DefaultHandler {
- private String currentTag;// 记住当前解析到的是什么标签
- private int needNumbe = 2; // 记住想获取第几个作者标签的值
- private int currentNumber=0;// 当前解析到的是第几个
- @Override
- public void startElement(String uri, String localName, String qName,
- Attributes attributes) throws SAXException {
- /**
- * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 localName -
- * 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 qName-标签名 attributes-属性,
- * attributes.getQName(i)提前属性名 etValue(i)提取属性值
- */
- currentTag = qName;
- if (currentTag.equals("name")) {
- currentNumber++;
- }
- }
- @Override
- public void endElement(String uri, String localName, String qName)
- throws SAXException {
- currentTag = null;
- }
- @Override
- public void characters(char[] ch, int start, int length)
- throws SAXException {
- /**
- * ch - 字符 start - 字符数组中的开始位置 length - 从字符数组中使用的字符数。
- */
- /*********("name").equals(currentTag)一定要("name")在前********************/
- if (("name").equals(currentTag) && currentNumber == needNumbe) {
- System.out.println("name:" + new String(ch, start, length));
- }
- }
- }