XML解析

简介: XML解析

一.DOM

studentx.xml

<?xml version="1.0"?> 
<students> 
  <student> 
    <name>John</name> 
    <grade>B</grade> 
    <age>12</age> 
  </student> 
  <student> 
    <name>Mary</name> 
    <grade>A</grade> 
    <age>11</age> 
  </student> 
  <student> 
    <name>Simon</name> 
    <grade>A</grade> 
    <age>18</age> 
  </student> 
</students>

XMLParser.java

import java.io.File;  
import javax.xml.parsers.DocumentBuilder;  
import javax.xml.parsers.DocumentBuilderFactory;  
import org.w3c.dom.Document;  
import org.w3c.dom.Element;  
import org.w3c.dom.Node;  
import org.w3c.dom.NodeList;  
public class XMLParser {
  public void getAllUserNames(String fileName) {  
      try {
      //1.获得一个文档解析器工厂:定义工厂API,使应用程序能够从XML文档获取生成DOM对象树的解析器
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
      //2.获得一个文档解析器:定义从XML文档获取DOM文档实例的API。 使用这个类,应用程序员可以从XML获得一个Document 。
      DocumentBuilder db = dbf.newDocumentBuilder();  
      File file = new File(fileName);  
      if (file.exists()) {  
        //3.解析器解析xmL文件,获得一个DOM文档
        Document doc = db.parse(file);  
        //4.通过DOM文档获取根结点元素,并打印
        Element docEle = doc.getDocumentElement();  
        System.out.println("Root element of the document: "+ docEle.getNodeName());  
        //5.通过DOM文档根据标签名获取所有其对应的结点,并将其存储在NodeList抽象集合中
        NodeList studentList = docEle.getElementsByTagName("student");  
        System.out.println("Total students: " + studentList.getLength());  
        //6.打印"student"结点下所有的结点信息
        if(studentList != null && studentList.getLength() > 0) {  
          for(int i = 0; i < studentList.getLength(); i++) {  
            //7.遍历一个"student"结点
            Node node = studentList.item(i);  
            //8.node.getNodeType() == Node.ELEMENT_NODE,表示node结点是一个Element(一组)
            if(node.getNodeType() == Node.ELEMENT_NODE) {  
              System.out.println("=====================");  
              Element e = (Element) node;  
              NodeList nodeList = e.getElementsByTagName("name");  
              System.out.println("Name: "+ nodeList.item(0).getChildNodes().item(0).getNodeValue());  
              nodeList = e.getElementsByTagName("grade");
              System.out.println("Grade: "+nodeList.item(0).getChildNodes().item(0)  .getNodeValue());  
              nodeList = e.getElementsByTagName("age");  
              System.out.println("Age: "+ nodeList.item(0).getChildNodes().item(0).getNodeValue());  
            }
          }  
        }
      }
    } catch (Exception e) {  
      System.out.println(e);  
    }  
  }  
  public static void main(String[] args) {  
    XMLParser parser = new XMLParser();  
    parser.getAllUserNames("./src/students.xml");  
  }  
}

2.XPath方式

users.xml

<?xml version="1.0"?> 
<users>
  <user id="1">
    <name>张三</name>
    <createTime>2018-10-15</createTime>
    <password>123</password>
    <phone>10086</phone>
    <nickName>阿毛</nickName>
  </user>
  <user id="2">
    <name>李四</name>
    <createTime>2018-10-15</createTime>
    <password>234</password>
    <phone>12306</phone>
    <nickName>二狗子</nickName>
  </user>
</users>
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class UserEntity {
  private Long id;
  private String name;
  private Date createTime;
  private String password;
  private String phone;
  private String nickName;
  static UserEntity buildUserEntity(String id, String name, String createTime, String password, String phone,
      String nickName) throws ParseException {
    UserEntity user=new UserEntity();
    user.id=Long.valueOf(id);
    user.name=name;
    user.createTime=new SimpleDateFormat("yyyy-MM-dd").parse(createTime);
    user.password=password;
    user.nickName=nickName;
    return user;
  }
  @Override
  public String toString() {
    // TODO Auto-generated method stub
    return id+"-"+name+"-"+createTime+"-"+password+"-"+nickName;
  }
}
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;  
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
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;  
public class XMLParser {  
  public void getAllUserNames(String fileName) {  
    try {
      //1.获得一个文档解析器工厂:定义工厂API,使应用程序能够从XML文档获取生成DOM对象树的解析器
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
      //2.获得一个文档解析器:定义从XML文档获取DOM文档实例的API。 使用这个类,应用程序员可以从XML获得一个Document 。
      DocumentBuilder builder = dbf.newDocumentBuilder();  
      File file=new File(fileName);
      //3.通过解析器解析xml文件,获得一个文档对象
      Document document=builder.parse(file);
      //4.获取新的XPathFactory实例
      XPathFactory xpathFactory=XPathFactory.newInstance();
      //5.一个XPathFactory实例可以用来创建XPath对象
      XPath xpath=xpathFactory.newXPath();
      //6.xpath根据根结点"users"标签解析document文档
      NodeList nodeList=(NodeList) xpath.evaluate("/users/*", document,XPathConstants.NODESET);
      //7.获取一个ArrayList实例用来存储UserEntity对象
      List<UserEntity> userList=new ArrayList<UserEntity>();
      //8.获取所有的user结点
      for(int i=1;i<nodeList.getLength()+1;i++) {
      String path="/users/user["+i+"]";
      String id=(String) xpath.evaluate(path+"/@id", document,XPathConstants.STRING);
      String name=(String) xpath.evaluate(path+"/name", document,XPathConstants.STRING);
      String createTime=(String) xpath.evaluate(path+"/createTime", document,XPathConstants.STRING);
      String password=(String) xpath.evaluate(path+"/password", document,XPathConstants.STRING);
      String phone=(String) xpath.evaluate(path+"/phone", document,XPathConstants.STRING);
      String nickName=(String) xpath.evaluate(path+"/nickName", document,XPathConstants.STRING);
      //调用buildUserEntity()方法构建UserEntity对象
      UserEntity userEntity=UserEntity.buildUserEntity(id,name,createTime,password,phone,nickName);
      userList.add(userEntity);
      }
      for(UserEntity user:userList) {
        System.out.println(user);
      }
    }catch(Exception e){
      e.getMessage();
    }
  }  
  public static void main(String[] args) {  
      XMLParser parser = new XMLParser();  
      parser.getAllUserNames("./src/users.xml");  
  }  
}

 

3.dom4j

1.引入依赖

    <!-- dom4j解析xml -->
    <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6.1</version>
  </dependency>

2.application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="userDao" class="cn.yiguang.testProject.annotation.UserDaoImpl"></bean>
    <bean id="user1Dao" class="cn.yiguang.testProject.annotation.User1DaoImpl"></bean>
    <bean id="user2Dao" class="cn.yiguang.testProject.annotation.User2DaoImpl"></bean>
    <bean id="userService" class="cn.yiguang.testProject.annotation.UserServiceImpl"></bean>
</beans>

3.BeanDefine.java

public class BeanDefine {
  private String id;
  private String className;
  public BeanDefine(String id, String className) {
    this.id = id;
    this.className = className;
  }
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public String getClassName() {
    return className;
  }
  public void setClassName(String className) {
    this.className = className;
  }
  @Override
  public String toString() {
    return "id:"+id+",className:"+className;
  }
}

4.测试

import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Test {
  public static void main(String[] args) {
    // 读取xml文件,转换成Document结点
    Document document = null;
    // 创建一个SAXReader解析器
    SAXReader saxReader = new SAXReader();
    try {
      ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
      document = saxReader.read(classLoader.getResourceAsStream("configAnnotation.xml"));
      Element beans = document.getRootElement();
      for (Iterator<Element> beansList = beans.elementIterator();beansList.hasNext();) {
        Element element = beansList.next();
        BeanDefine bean = new BeanDefine(element.attributeValue("id"), element.attributeValue("class"));
        System.out.println(bean.toString());
      }
    }catch (DocumentException e){
      System.out.println("解析配置文件出错......");
    }
  }
}


相关文章
|
14天前
|
XML 存储 IDE
Java_XML解析精讲
Java_XML解析精讲
11 0
|
19天前
|
XML 机器学习/深度学习 JSON
在火狐浏览器调ajax获取json数据时,控制台提示“XML 解析错误:格式不佳”。
在火狐浏览器调ajax获取json数据时,控制台提示“XML 解析错误:格式不佳”。
18 0
在火狐浏览器调ajax获取json数据时,控制台提示“XML 解析错误:格式不佳”。
|
30天前
|
XML Java 数据格式
Spring5源码(17)-Spring解析xml默认命名空间
Spring5源码(17)-Spring解析xml默认命名空间
16 0
|
30天前
|
XML JavaScript Java
Spring5源码(16)-Spring将Xml文件解析为Document对象
Spring5源码(16)-Spring将Xml文件解析为Document对象
26 0
|
1月前
|
XML 存储 安全
Unity 数据读取|(五)XML文件解析(XmlDocument,XmlTextReader)
Unity 数据读取|(五)XML文件解析(XmlDocument,XmlTextReader)
|
1月前
|
XML JavaScript Java
JAVA XML 解析
XML (eXtensible Markup Language) 意为可扩展标记语言,被多数技术人员用以选择作为数据传输的载体,成为一种通用的数据交换格式,xml的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的便利。在不同的语言中,解析xml的方式都是一样的,只不过实现的语法不同而已。众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J。
|
2月前
|
XML Java uml
spring 源码解析——第一篇(ioc xml方式)
spring 源码解析——第一篇(ioc xml方式)
22 0
|
19天前
|
XML JavaScript 数据格式
打开 XML 文件报错 There is no Unicode byte order mark
打开 XML 文件报错 There is no Unicode byte order mark
28 0
|
19天前
|
XML 存储 数据格式
什么是 XML 文件的 Schema
什么是 XML 文件的 Schema
11 0
|
26天前
|
XML C# 数据格式
c# 追加 数据至xml文件
c# 追加 数据至xml文件
11 0

推荐镜像

更多