Java生成和解析XML格式文件和字符串的实例代码

互联网 17-1-11
1、基础知识:Java解析XML一般有四种方法:DOM、SAX、JDOM、DOM4J。

2、使用介绍1)、DOM(1)简介

由W3C(org.w3c.dom)提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。优点就是整个文档都一直在内存中,我们可以随时访问任何节点,并且对树的遍历也是比较熟悉的操作;缺点则是耗内存,并且必须等到所有的文档都读入内存才能进行处理。

(2)示例代码:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>  <root>      <TelePhone>          <type name="nokia">              <price>599</price>              <operator>CMCC</operator>          </type>          <type name="xiaomi">              <price>699</price>              <operator>ChinaNet</operator>          </type>      </TelePhone>  </root>
import java.io.ByteArrayOutputStream;  import java.io.File;  import java.io.FileOutputStream;  import java.io.IOException;  import java.io.StringReader;  import javax.xml.parsers.DocumentBuilder;  import javax.xml.parsers.DocumentBuilderFactory;  import javax.xml.parsers.ParserConfigurationException;  import javax.xml.transform.Transformer;  import javax.xml.transform.TransformerConfigurationException;  import javax.xml.transform.TransformerException;  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;  import org.xml.sax.InputSource;  import org.xml.sax.SAXException;  public class XMLHandler {      public XMLHandler(){                }            public String createXML(){          String xmlStr = null;          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();          try {              DocumentBuilder builder = factory.newDocumentBuilder();              Document document = builder.newDocument();              document.setXmlVersion("1.0");                            Element root = document.createElement("root");              document.appendChild(root);                            Element telephone = document.createElement("TelePhone");                            Element nokia = document.createElement("type");              nokia.setAttribute("name", "nokia");                            Element priceNokia = document.createElement("price");              priceNokia.setTextContent("599");              nokia.appendChild(priceNokia);                            Element operatorNokia = document.createElement("operator");              operatorNokia.setTextContent("CMCC");              nokia.appendChild(operatorNokia);                            telephone.appendChild(nokia);                            Element xiaomi = document.createElement("type");              xiaomi.setAttribute("name", "xiaomi");                            Element priceXiaoMi = document.createElement("price");              priceXiaoMi.setTextContent("699");              xiaomi.appendChild(priceXiaoMi);                            Element operatorXiaoMi = document.createElement("operator");              operatorXiaoMi.setTextContent("ChinaNet");              xiaomi.appendChild(operatorXiaoMi);                            telephone.appendChild(xiaomi);                            root.appendChild(telephone);                            TransformerFactory transFactory = TransformerFactory.newInstance();              Transformer transFormer = transFactory.newTransformer();              DOMSource domSource = new DOMSource(document);                            //export string              ByteArrayOutputStream bos = new ByteArrayOutputStream();              transFormer.transform(domSource, new StreamResult(bos));              xmlStr = bos.toString();                            //-------              //save as file              File file = new File("TelePhone.xml");              if(!file.exists()){                  file.createNewFile();              }              FileOutputStream out = new FileOutputStream(file);              StreamResult xmlResult = new StreamResult(out);              transFormer.transform(domSource, xmlResult);              //--------          } catch (ParserConfigurationException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }catch (TransformerConfigurationException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }catch (TransformerException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }catch (IOException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }                    return xmlStr;      }            public void parserXML(String strXML){          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();          try {              DocumentBuilder builder = factory.newDocumentBuilder();              StringReader sr = new StringReader(strXML);              InputSource is = new InputSource(sr);              Document doc = builder.parse(is);              Element rootElement = doc.getDocumentElement();              NodeList phones = rootElement.getElementsByTagName("type");              for (int i = 0; i < phones.getLength(); i++) {                  Node type = phones.item(i);                  String phoneName = ((Element)type).getAttribute("name");                  System.out.println("Phone name = "+phoneName);                  NodeList properties = type.getChildNodes();                  for (int j = 0; j < properties.getLength(); j++) {                      Node property = properties.item(j);                      String nodeName = property.getNodeName();                      if (nodeName.equals("price")) {                          String price=property.getFirstChild().getNodeValue();                          System.out.println("price="+price);                      } else if (nodeName.equals("operator")) {                          String operator=property.getFirstChild().getNodeValue();                          System.out.println("operator="+operator);                      }                  }              }          } catch (ParserConfigurationException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }catch (SAXException e) {              // TODO Auto-generated catch block              e.printStackTrace();          } catch (IOException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }      }            public static void main(String[] args) {          XMLHandler handler = new XMLHandler();          String xml = handler.createXML();          System.out.println(xml);          handler.parserXML(xml);      }  }

(3)元素(Element)和结点(Node)的区别(org.w3c.dom) Node对象是整个文档对象模型的主要数据类型,是DOM中最基本的对象,代表了文档树中的抽象节点。但在实际使用中很少会直接使用Node对象,而是使用Node对象的子对象Element,Attr,Text等。Element对象表示HTML或XML文档中的一个元素,是Node类最主要的子对象,在元素中可以包含属性,因而Element中有存取其属性的方法。Element是从Node继承而来的,元素是一个小范围的定义,必须是含有完整信息的结点才是一个元素,例如<div>...</div>。但是一个结点不一定是一个元素,而一个元素一定是一个结点。node有几个子类型:Element,Text,Attribute,RootElement,Comment,Namespace等

2)、SAX

4)、DOM4J(1)简介dom4j是目前在xml解析方面是最优秀的(Hibernate、Sun的JAXM也都使用dom4j来解析XML),它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。在使用XPATH时要增加jaxen.jar,否则会出现如下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException  at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)  at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)        at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164)

(2)示例代码:

import java.io.File;  import java.io.FileWriter;  import java.io.IOException;  import java.io.StringReader;  import java.io.StringWriter;  import java.util.List;  import org.dom4j.Document;  import org.dom4j.DocumentException;  import org.dom4j.DocumentHelper;  import org.dom4j.Element;  import org.dom4j.io.OutputFormat;  import org.dom4j.io.SAXReader;  import org.dom4j.io.XMLWriter;  import org.xml.sax.InputSource;  public class XMLHandler {      public XMLHandler() {          // TODO Auto-generated constructor stub      }            public String createXML(){          String strXML = null;          Document document = DocumentHelper.createDocument();          Element root = document.addElement("root");                    Element phone = root.addElement("TelePhone");                    Element nokia = phone.addElement("type");          nokia.addAttribute("name", "nokia");          Element price_nokia = nokia.addElement("price");          price_nokia.addText("599");          Element operator_nokia = nokia.addElement("operator");          operator_nokia.addText("CMCC");                    Element xiaomi = phone.addElement("type");          xiaomi.addAttribute("name", "xiaomi");          Element price_xiaomi = xiaomi.addElement("price");          price_xiaomi.addText("699");          Element operator_xiaomi = xiaomi.addElement("operator");          operator_xiaomi.addText("ChinaNet");                    //--------          StringWriter strWtr = new StringWriter();          OutputFormat format = OutputFormat.createPrettyPrint();          format.setEncoding("UTF-8");          XMLWriter xmlWriter =new XMLWriter(strWtr, format);          try {              xmlWriter.write(document);          } catch (IOException e1) {              // TODO Auto-generated catch block              e1.printStackTrace();          }          strXML = strWtr.toString();          //--------                    //-------          //strXML=document.asXML();          //------                    //-------------          File file = new File("TelePhone.xml");            if (file.exists()) {                file.delete();            }            try {              file.createNewFile();              XMLWriter out = new XMLWriter(new FileWriter(file));                out.write(document);                out.flush();                out.close();          } catch (IOException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }          //--------------                    return strXML;      }            public void parserXML(String strXML){          SAXReader reader = new SAXReader();          StringReader sr = new StringReader(strXML);          InputSource is = new InputSource(sr);          try {              Document document = reader.read(is);                            Element root = document.getRootElement();                            //get element              List<Element> phoneList = root.elements("TelePhone");              List<Element> typeList = phoneList.get(0).elements("type");              for (int i=0;i<typeList.size();i++){                  Element element = typeList.get(i);                  String phoneName = element.attributeValue("name");                  System.out.println("phonename = "+phoneName);                  //get all element                  List<Element> childList = element.elements();                  for (int j=0;j<childList.size();j++){                      Element e = childList.get(j);                      System.out.println(e.getName()+"="+e.getText());                  }              }          } catch (DocumentException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }      }            public void parserXMLbyXPath(String strXML){          SAXReader reader = new SAXReader();          StringReader sr = new StringReader(strXML);          InputSource is = new InputSource(sr);          try {              Document document = reader.read(is);              List list = document.selectNodes("/root/TelePhone/type");              for(int i=0;i<list.size();i++){                  Element e = (Element) list.get(i);                  System.out.println("phonename="+e.attributeValue("name"));                  List list1 = e.selectNodes("./*");                  for(int j=0;j<list1.size();j++){                      Element e1 = (Element) list1.get(j);                      System.out.println(e1.getName()+"="+e1.getText());                  }              }          } catch (DocumentException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }      }      /**       * @param args       */      public static void main(String[] args) {          // TODO Auto-generated method stub          XMLHandler handler = new XMLHandler();          String strXML=handler.createXML();          System.out.println(strXML);          handler.parserXML(strXML);          System.out.println("-----------");          handler.parserXMLbyXPath(strXML);      }  }

5)XPATH(1)简介XPath是一门在XML文档中查找信息的语言。XPath用于在XML文档中通过元素和属性进行导航。具体语法介绍参考:http://w3school.com.cn/xpath/index.asp

(2)示例代码:

import java.io.IOException;  import java.io.StringReader;  import javax.xml.parsers.DocumentBuilder;  import javax.xml.parsers.DocumentBuilderFactory;  import javax.xml.parsers.ParserConfigurationException;  import javax.xml.xpath.XPath;  import javax.xml.xpath.XPathConstants;  import javax.xml.xpath.XPathExpression;  import javax.xml.xpath.XPathExpressionException;  import javax.xml.xpath.XPathFactory;  import org.w3c.dom.Document;  import org.w3c.dom.Element;  import org.w3c.dom.Node;  import org.w3c.dom.NodeList;  import org.xml.sax.InputSource;  import org.xml.sax.SAXException;  public class XMLHandler {      public XMLHandler() {          // TODO Auto-generated constructor stub      }            public void parserXML(String strXML){          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();          try {              DocumentBuilder builder = factory.newDocumentBuilder();              StringReader sr = new StringReader(strXML);              InputSource is = new InputSource(sr);              Document doc = builder.parse(is);                            XPathFactory xFactory = XPathFactory.newInstance();              XPath xpath = xFactory.newXPath();              XPathExpression expr = xpath.compile("/root/TelePhone/type");              NodeList phones = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);                for (int i = 0; i < phones.getLength(); i++) {                  Node type = phones.item(i);                  String phoneName = ((Element)type).getAttribute("name");                  System.out.println("Phone name = "+phoneName);                  XPathExpression expr1 = xpath.compile("./*");                  NodeList list = (NodeList) expr1.evaluate(type, XPathConstants.NODESET);                  for(int j =0;j<list.getLength();j++){                      Element e1 = (Element) list.item(j);                      System.out.println(e1.getNodeName()+"="+e1.getTextContent());                  }                                }          } catch (ParserConfigurationException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }catch (SAXException e) {              // TODO Auto-generated catch block              e.printStackTrace();          } catch (IOException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }catch (XPathExpressionException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }      }      /**       * @param args       */      public static void main(String[] args) {          // TODO Auto-generated method stub          String strXML="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>"+                      "<root>"+                          "<TelePhone>"+                              "<type name=\"nokia\">"+                                  "<price>599</price>"+                                  "<operator>CMCC</operator>"+                              "</type>"+                              "<type name=\"xiaomi\">"+                                  "<price>699</price>"+                                  "<operator>ChinaNet</operator>"+                              "</type>"+                          "</TelePhone>"+                      "</root>";          XMLHandler handler = new XMLHandler();          handler.parserXML(strXML);      }  }

更多Java生成和解析XML格式文件和字符串的实例代码相关文章请关注PHP中文网!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:Java如何读取XML文件 具体实现

相关资讯