java解析xml_dome_SAX

DOM解析XML

student.xml

  
  
  
  
  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?><exam> 
  2.  
  3.     <student examid="222" idcard="111"> 
  4.         <name>newValue</name> 
  5.         <location>沈阳</location> 
  6.         <grade>89</grade> 
  7.     </student> 
  8.  
  9.     <student examid="444" idcard="333"> 
  10.         <name>newValue</name> 
  11.         <location>大连</location> 
  12.         <grade>97</grade> 
  13.     </student> 
  14.  
  15. </exam> 

 

testadmin.java

  
  
  
  
  1. package com.dwt1220;  
  2.  
  3. import java.io.FileOutputStream;  
  4.  
  5. import javax.xml.parsers.DocumentBuilder;  
  6. import javax.xml.parsers.DocumentBuilderFactory;  
  7. import javax.xml.transform.Transformer;  
  8. import javax.xml.transform.TransformerFactory;  
  9. import javax.xml.transform.dom.DOMSource;  
  10. import javax.xml.transform.stream.StreamResult;  
  11.  
  12. import org.w3c.dom.Document;  
  13. import org.w3c.dom.Element;  
  14. import org.w3c.dom.Node;  
  15. import org.w3c.dom.NodeList;  
  16.  
  17. public class testadmin {  
  18.  
  19.     public static void main(String[] args) throws Exception {  
  20.         /**************************** 创建Document类 *********************************************/ 
  21.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  22.         DocumentBuilder builder = factory.newDocumentBuilder();  
  23.         Document document = builder.parse("./src/student.xml");  
  24.  
  25.          /**************************** 添加student节点  
  26.          *********************************************/ 
  27.          /**  
  28.          * ①创建节点  
  29.          * ②设置节点的值(包括属性)  
  30.          * ③获得节点插入的位置  
  31.          * ④插入节点  
  32.          * ⑤更新文件  
  33.          */ 
  34.          /**①创建节点*/ 
  35.          /************ 创建student节点 **********/ 
  36.          Element studentElement = document.createElement("student");  
  37.          /************ 创建name,location,grade节点 **********/ 
  38.          Element nameElement = document.createElement("name");  
  39.          Element locationElement = document.createElement("location");  
  40.          Element gradeElement = document.createElement("grade");  
  41.           
  42.          /**②设置节点的值(包括属性)*/ 
  43.          /************ 设置name,location,grade节点的值 ******/ 
  44.          nameElement.setTextContent("nameValue");  
  45.          locationElement.setTextContent("locationValue");  
  46.          gradeElement.setTextContent("gradeValue");  
  47.           
  48.          /************ 设置student节点的属性*******/ 
  49.          studentElement.setAttribute("examid""value");  
  50.          studentElement.setAttribute("idcard""value");  
  51.           
  52.           
  53.          /**③获得节点插入的位置*/ 
  54.          /************ 获得XML的根节点 ******/ 
  55.          Node rootNode = document.getElementsByTagName("exam").item(0);  
  56.  
  57.          /**④插入节点*/ 
  58.          /************ 把student节点添加到根节点下 ******/ 
  59.          rootNode.appendChild(studentElement);  
  60.          /************ 把name,locationt,gradet节点添加到student节点下 ******/ 
  61.          studentElement.appendChild(nameElement);  
  62.          studentElement.appendChild(locationElement);  
  63.          studentElement.appendChild(gradeElement);  
  64.           
  65.          /**⑤更新文件*/ 
  66.          TransformerFactory transformerFactory =  
  67.          TransformerFactory.newInstance();  
  68.          Transformer tf = transformerFactory.newTransformer();  
  69.          tf.transform(new DOMSource(document), new StreamResult(  
  70.          new FileOutputStream("./src/student.xml")));  
  71.  
  72.         // /**************************** 修改name节点  
  73.         // *********************************************/  
  74.         // /**  
  75.         // * 把name值为nameValue修改成newValue  
  76.         // * ① 获得name节点的list  
  77.         // * ②查找内容相符的name节点  
  78.         // * ③修改节点内容  
  79.         // * ④更新文件  
  80.         // */  
  81.         // String updataValue = "nameValue";  
  82.         //  
  83.         // /************ ① 获得需要修改的节点 **************/  
  84.         // NodeList nameNodeList = document.getElementsByTagName("name");  
  85.         //  
  86.         // /************ ②查找内容相符的节点 **************/  
  87.         // for (int i = 0; i < nameNodeList.getLength(); i++) {  
  88.         //  
  89.         // /************ ③修改节点内容 **************/  
  90.         // if (updataValue.equals(nameNodeList.item(i).getTextContent()))  
  91.         // nameNodeList.item(i).setTextContent("newValue");  
  92.         // }  
  93.         //  
  94.         // /** ④更新文件 */  
  95.         // TransformerFactory transformerFactory = TransformerFactory  
  96.         // .newInstance();  
  97.         // Transformer tf = transformerFactory.newTransformer();  
  98.         // tf.transform(new DOMSource(document), new StreamResult(  
  99.         // new FileOutputStream("./src/student.xml")));  
  100.  
  101.         // /**************************** 删除节点or替换节点  
  102.         // *********************************************/  
  103.         // /***  
  104.         // * 把name值为nameValue的Student节点删除  
  105.         // * ① 获得name节点的list  
  106.         // * ②查找内容相符的name节点  
  107.         // * ③获得name的Student父节点, 从Student的父节点删除student  
  108.         // * ④更新文件  
  109.         // */  
  110.         // String delaValue = "nameValue";  
  111.         //  
  112.         // /************ ① 获得name节点的list **************/  
  113.         // NodeList nameNodeList = document.getElementsByTagName("name");  
  114.         //  
  115.         // /************ ②查找内容相符的name节点 **************/  
  116.         // for (int i = 0; i < nameNodeList.getLength(); i++) {  
  117.         // if (delaValue.equals(nameNodeList.item(i).getTextContent())) {  
  118.         // /************ ③获得name的Student父节点,从Student的父节点删除student  
  119.         // **************/  
  120.         // nameNodeList.item(i).getParentNode().getParentNode()  
  121.         // .removeChild(nameNodeList.item(i).getParentNode());  
  122.         // /*******如果要替换节点用.replaceChild(newChild, oldChild)方法************/  
  123.         // }  
  124.         // }  
  125.         //  
  126.         // /** ④更新文件 */  
  127.         // TransformerFactory transformerFactory = TransformerFactory  
  128.         // .newInstance();  
  129.         // Transformer tf = transformerFactory.newTransformer();  
  130.         // tf.transform(new DOMSource(document), new StreamResult(  
  131.         // new FileOutputStream("./src/student.xml")));  
  132.  
  133.         // /************** 解析xml ************************/  
  134.         // /****获得根节点*****/  
  135.         // Element rootElement = document.getDocumentElement();  
  136.         // /****获得所有student节点****/  
  137.         // NodeList studentNodeList =  
  138.         // rootElement.getElementsByTagName("student");  
  139.         //  
  140.         // /****打印student的节点名,和值****/  
  141.         // for (int i = 0; i < studentNodeList.getLength(); i++) {  
  142.         // System.out.println("studentNodeitem("+"i):   "+studentNodeList.item(i).getNodeName());  
  143.         //  
  144.         // /****获得所有student下的所有子节点****/  
  145.         // NodeList studentChildNodeList =  
  146.         // studentNodeList.item(i).getChildNodes();  
  147.         //  
  148.         // /****打印student下的所有字节点的,节点名 和值 ※回车算一个字text节点****/  
  149.         // for(int j=0;j<studentChildNodeList.getLength();j++){  
  150.         // System.out.println(studentChildNodeList.item(j).getNodeName()+"  "+studentChildNodeList.item(j).getTextContent());  
  151.         // }  
  152.         //  
  153.         // }  
  154.     }  
  155.  
  156. }  

 ※回车算一个字text节点

 ※修改完XML文件一定要更新内存

 

SAX解析

test.xml

  
  
  
  
  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?><exam> 
  2.     <student examid="222" idcard="111"> 
  3.         <name>张三</name> 
  4.         <location>沈阳</location> 
  5.         <grade>89</grade> 
  6.     </student> 
  7.  
  8.     <student examid="444" idcard="333"> 
  9.         <name>李四</name> 
  10.         <location>大连</location> 
  11.         <grade>97</grade> 
  12.     </student> 
  13.  
  14.       
  15. </exam> 

testadmin.java

  
  
  
  
  1. package com.dwt1220;  
  2.  
  3. import javax.xml.parsers.ParserConfigurationException;  
  4. import javax.xml.parsers.SAXParser;  
  5. import javax.xml.parsers.SAXParserFactory;  
  6. import org.xml.sax.Attributes;  
  7. import org.xml.sax.ContentHandler;  
  8. import org.xml.sax.Locator;  
  9. import org.xml.sax.XMLReader;  
  10. import org.xml.sax.helpers.DefaultHandler;  
  11. import org.xml.sax.SAXException;  
  12.  
  13. import sun.security.smartcardio.SunPCSC.Factory;  
  14.  
  15. import java.util.Properties;  
  16.  
  17. public class testadmin extends DefaultHandler {  
  18.     public static void main(String[] args) throws Exception {  
  19.         /**  
  20.          * 1.创建解析工厂 SAXParserFactory 2.得到解析器 SAXParser 3.得到读取器 XMLReader  
  21.          * 4.设置内容处理 xMLReader.setContentHandler(handler)  
  22.          * 传入一个继承了ContentHandler,并重写了其中方法的类 (一般继承实现了ContentHandler,  
  23.          * DefaultHandler类) 5.读取xml文档内容  
  24.          */ 
  25.  
  26.         /******************** 1.创建解析工厂 *************************/ 
  27.         SAXParserFactory factory = SAXParserFactory.newInstance();  
  28.         /******************** 2.得到解析器 *************************/ 
  29.         SAXParser sp = factory.newSAXParser();  
  30.         /******************** 3.得到读取器 *************************/ 
  31.         XMLReader reader = sp.getXMLReader();  
  32.         /******ListHandler得到xml文档所有内容  
  33.          * TagValueHandler得到xml文档指定内容 *************************/ 
  34.         ContentHandler handler = new TagValueHandler();  
  35.         /******************** 4.设置内容处理 *************************/ 
  36.         reader.setContentHandler(handler);  
  37.         /******************** 5.读取xml文档内容 *************************/ 
  38.         reader.parse("src/test.xml");  
  39.     }  
  40. }  
  41.  
  42. /******* 得到xml文档所有内容 ************/ 
  43. class ListHandler extends DefaultHandler {  
  44.  
  45.     @Override 
  46.     public void startDocument() throws SAXException {  
  47.         System.out.println("startDocument");  
  48.     }  
  49.  
  50.     @Override 
  51.     public void endDocument() throws SAXException {  
  52.         System.out.println("endDocument");  
  53.     }  
  54.  
  55.     @Override 
  56.     public void startElement(String uri, String localName, String qName,  
  57.             Attributes attributes) throws SAXException {  
  58.         /**  
  59.          * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 localName -  
  60.          * 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 qName-标签名 attributes-属性,  
  61.          * attributes.getQName(i)提前属性名 etValue(i)提取属性值  
  62.          */ 
  63.         System.out.print("<" + qName + "  ");  
  64.         for (int i = 0; attributes != null && i < attributes.getLength(); i++) {  
  65.             System.out.print(attributes.getQName(i) + "=\"" 
  66.                     + attributes.getValue(i) + "\"  ");  
  67.         }  
  68.         System.out.println(">");  
  69.  
  70.     }  
  71.  
  72.     @Override 
  73.     public void endElement(String uri, String localName, String qName)  
  74.             throws SAXException {  
  75.         System.out.println("</" + qName + ">");  
  76.     }  
  77.  
  78.     @Override 
  79.     public void characters(char[] ch, int start, int length)  
  80.             throws SAXException {  
  81.         /**  
  82.          * ch - 字符 start - 字符数组中的开始位置 length - 从字符数组中使用的字符数。  
  83.          */ 
  84.         System.out.println(new String(ch, start, length));  
  85.     }  
  86.  
  87. }  
  88.  
  89. /******* 得到xml文档指定内容 ************/ 
  90. class TagValueHandler extends DefaultHandler {  
  91.     private String currentTag;// 记住当前解析到的是什么标签  
  92.     private int needNumbe = 2// 记住想获取第几个作者标签的值  
  93.     private int currentNumber=0;// 当前解析到的是第几个  
  94.  
  95.     @Override 
  96.     public void startElement(String uri, String localName, String qName,  
  97.             Attributes attributes) throws SAXException {  
  98.         /**  
  99.          * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 localName -  
  100.          * 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 qName-标签名 attributes-属性,  
  101.          * attributes.getQName(i)提前属性名 etValue(i)提取属性值  
  102.          */ 
  103.         currentTag = qName;  
  104.         if (currentTag.equals("name")) {  
  105.             currentNumber++;  
  106.         }  
  107.     }  
  108.  
  109.     @Override 
  110.     public void endElement(String uri, String localName, String qName)  
  111.             throws SAXException {  
  112.         currentTag = null;  
  113.     }  
  114.  
  115.     @Override 
  116.     public void characters(char[] ch, int start, int length)  
  117.             throws SAXException {  
  118.         /**  
  119.          * ch - 字符 start - 字符数组中的开始位置 length - 从字符数组中使用的字符数。  
  120.          */ 
  121.         /*********("name").equals(currentTag)一定要("name")在前********************/ 
  122.         if (("name").equals(currentTag) && currentNumber == needNumbe) {  
  123.             System.out.println("name:" + new String(ch, start, length));  
  124.         }  
  125.     }  
  126.  

 

 

你可能感兴趣的:(xml,dom,sax,职场,休闲)