用Stax方式处理xml

1.读取xml文件,首先用类加载器加载项目目录下的xml文件,从XMLInputFactory创建我所需要的XMLStreamReader,即得到了xml文件。根据XMLStreamConstant

属性值,就可以操作所得到的xml文件内容,详情看以下代码。

public class TestStax {
    public static void main(String[] args) {
        //基于光标式的
//        new TestStax().baseStax();
//        new TestStax().baseStax_01();
        //基于迭代模型的
//       new TestStax().baseStax_02();
     //基于过滤器的 
     new TestStax().baseStax_03();  }
public void baseStax(){ XMLInputFactory xif = XMLInputFactory.newInstance(); InputStream is = null; XMLStreamReader xsr = null; try { //第一种加载文件方式,此文件在根目录下 is = TestStax.class.getClassLoader().getResourceAsStream("menu.xml"); xsr = xif.createXMLStreamReader(is); while(xsr.hasNext()){ int type = xsr.next(); System.out.println(type); if(type == XMLStreamConstants.START_ELEMENT){ System.out.println(xsr.getName()); }else if(type == XMLStreamConstants.CHARACTERS){ System.out.println(xsr.getText().trim()); }else if(type == XMLStreamConstants.END_ELEMENT){ System.out.println("/" + xsr.getName()); } } } catch (Exception e) { e.printStackTrace(); }finally{ if(is != null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } } public void baseStax_01(){ XMLInputFactory xif = XMLInputFactory.newInstance(); InputStream is = null; XMLStreamReader xmlsr = null; try { //另一种加载文件方式 is = new FileInputStream(System.getProperty("java.class.path") + File.separator + "menu.xml"); xmlsr = xif.createXMLStreamReader(is); while(xmlsr.hasNext()){ int type = xmlsr.next(); //XMLStreamConstants.START_ELEMENT=1 if(type == 1){ if("name".equals(xmlsr.getName().toString())){ System.out.print(xmlsr.getElementText() + ":"); }else if("price".equals(xmlsr.getName().toString())){ System.out.println(xmlsr.getElementText()); } } } } catch (Exception e) { e.printStackTrace(); }finally{ if(is != null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } } public void baseStax_02(){ XMLInputFactory xif = XMLInputFactory.newInstance(); InputStream is = null;
is
= TestStax.class.getClassLoader().getResourceAsStream("menu.xml"); try { XMLEventReader xmler = xif.createXMLEventReader(is); while(xmler.hasNext()){ XMLEvent xmle = xmler.nextEvent(); if(xmle.isStartElement()){ String name = xmle.asStartElement().getName().toString(); if("name".equals(name)){ System.out.print(xmler.getElementText() + ":"); }else if("price".equals(name)){ System.out.println(xmler.getElementText()); } } } } catch (XMLStreamException e) { // TODO Auto-generated catch block e.printStackTrace(); } }   public void baseStax_03(){
  XMLInputFactory xif = XMLInputFactory.newFactory();
  InputStream is = TestStax.class.getClassLoader().getResourceAsStream("menu.xml");
  XMLEventReader xmler = null;
  try {
   xmler = xif.createFilteredReader(xif.createXMLEventReader(is), new EventFilter() {
    @Override
    public boolean accept(XMLEvent event) {
     if(event.isStartElement()){
      String name = event.asStartElement().getName().toString();
      if("name".equals(name) || "price".equals(name)){
       return true;
      }
     }
     return false;
    }
   } );
  } catch (XMLStreamException e) {
   e.printStackTrace();
  }
  while(xmler.hasNext()){ 
   try {
    XMLEvent xmle = xmler.nextEvent();
    if(xmle.isStartElement()){
     String nm = xmle.asStartElement().getName().toString();
     if("name".equals(nm)){
      System.out.print(xmler.getElementText() + ":");
     }else if("price".equals(nm)){
      System.out.println(xmler.getElementText());
     }
    }
   } catch (XMLStreamException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }

}

 下面是我说是用的xml,在w3cSchool里弄的xml文件,也可以自己建一个xml文件

<?xml version="1.0" encoding="UTF-8"?>

 <breakfast_menu>
 <food ceshi="test">
  <name>Belgian Waffles</name> 
  <price>$5.95</price> 
  <description>two of our famous Belgian Waffles with plenty of real maple syrup</description> 
  <calories>650</calories> 
  </food>
 <food ceshi="test">
  <name>Strawberry Belgian Waffles</name> 
  <price>$7.95</price> 
  <description>light Belgian waffles covered with strawberries and whipped cream</description> 
  <calories>900</calories> 
  </food>
 <food>
  <name>Berry-Berry Belgian Waffles</name> 
  <price>$8.95</price> 
  <description>light Belgian waffles covered with an assortment of fresh berries and whipped cream</description> 
  <calories>900</calories> 
  </food>
 <food>
  <name>French Toast</name> 
  <price>$4.50</price> 
  <description>thick slices made from our homemade sourdough bread</description> 
  <calories>600</calories> 
  </food>
 <food>
  <name>Homestyle Breakfast</name> 
  <price>$6.95</price> 
  <description>two eggs, bacon or sausage, toast, and our ever-popular hash browns</description> 
  <calories>950</calories> 
  </food>
  </breakfast_menu>

 3.基于Xpath处理xml

 1     //基于Xpath
 2     public void baseStax_04(){
 3         InputStream is = null;
 4         is = TestStax.class.getClassLoader().getResourceAsStream("menu.xml");
 5         XPathFactory xpf = XPathFactory.newInstance();
 6         XPath xp = xpf.newXPath();    
 7         try {
 8             //创建文档对象
 9             DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
10             //创建文档
11             Document doc = db.parse(is);
12             NodeList nl = (NodeList)xp.evaluate("//food[@ceshi='test']", doc,XPathConstants.NODESET);
13 //            for(int i=0;i<nl.getLength();i++){
14 //                Element ele = (Element)nl.item(i);
15 //                String value = ele.getElementsByTagName("name").item(0).getTextContent();
16 //                System.out.println(value);
17 //            }
18             //当不把node转化为element时
19             for(int j=0;j<nl.getLength();j++){
20                 NodeList nodelist = nl.item(j).getChildNodes();
21                 for(int p=0;p<nodelist.getLength();p++){
22                     Node nodechild = nodelist.item(p);
23                     if(nodechild.getNodeName() != "#text"){
24                         System.out.println(nodechild.getNodeName() + ":" + nodechild.getTextContent());
25                     }
26                 }
27             }
28         } catch (Exception e) {
29             e.printStackTrace();
30         }
31     }

 4.修改xml,用XPath计算得到查找的位置,修改后用Transformer进行替换原文件

 1 public void update_xml(){
 2         XPath xpath = XPathFactory.newInstance().newXPath();
 3         InputStream is = TestStax.class.getClassLoader().getResourceAsStream("menu.xml");
 4         Document doc= null;
 5         try {
 6             doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
 7             NodeList nodelist = (NodeList)xpath.evaluate("//food[name='Belgian']", doc,XPathConstants.NODESET );
 8             Element element = (Element)nodelist.item(0);
 9             Element ele = (Element)element.getElementsByTagName("price").item(0);
10             System.out.println(ele.getTextContent());
11             ele.setTextContent("12121");
12             Transformer transformer = TransformerFactory.newInstance().newTransformer();
13             transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
14             Result result = new StreamResult(System.out);
15             transformer.transform(new DOMSource(doc), result);
16         } catch (Exception e) {
17             e.printStackTrace();
18         }    
19     }

5.以XMLStreamWriter的方式写入xml

 1 public void writeXml(){
 2         try {
 3             XMLStreamWriter xmlsw = XMLOutputFactory.newFactory().createXMLStreamWriter(System.out);
 4             xmlsw.writeStartDocument("UTF-8", "1.0");
 5             xmlsw.writeEndDocument();
 6             String ns = "http://xiaoqiaolv";
 7             xmlsw.writeStartElement("ns","student",ns);
 8             xmlsw.writeStartElement("name");
 9             xmlsw.writeAttribute("realname","zhangsan");
10             xmlsw.writeCharacters("text");
11             xmlsw.writeEndElement();
12             xmlsw.writeEndElement();
13             xmlsw.flush();
14             xmlsw.close();
15         } catch (Exception e) {
16             e.printStackTrace();
17         }
18     }
我很小我很弱,我在慢慢成长!
原文地址:https://www.cnblogs.com/lvzhanhui/p/xiaoqiaolv_stax.html