使用java读取xml数据,java读取xml文件的几种方式

发布时间:2022-11-17

本文目录一览:

  1. java如何从xml文件中读取一个值
  2. java解析xml有几种方法
  3. JAVA 读取XML文件
  4. java如何读取xml文件

java如何从xml文件中读取一个值

java读取xml信息常用技术有dom解析和dom4J解析 dom4j是最常用的java解析xml技术,在使用时需要下载dom4j.jar 具体解析方法可以参考一下内容 xml结构

books
  book id="001"
    titleHarry Potter/title
    authorJ K. Rowling/author
  /book
  book id="002"
    titleLearning XML/title
    authorErik T. Ray/author
  /book
/books

解析为List集合

import java.io.File;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo {
  public static void main(String[] args) throws Exception {
    SAXReader reader = new SAXReader();
    File file = new File("books.xml");
    Document document = reader.read(file);
    Element root = document.getRootElement();
    List<Element> childElements = root.elements();
    for (Element child : childElements) {
      // 未知属性名情况下
      /*
      List<Attribute> attributeList = child.attributes();
      for (Attribute attr : attributeList) {
        System.out.println(attr.getName() + ": " + attr.getValue());
      }
      */
      // 已知属性名情况下
      System.out.println("id: " + child.attributeValue("id"));
      // 未知子元素名情况下
      /*
      List<Element> elementList = child.elements();
      for (Element ele : elementList) {
        System.out.println(ele.getName() + ": " + ele.getText());
      }
      System.out.println();
      */
      // 已知子元素名的情况下
      System.out.println("title" + child.elementText("title"));
      System.out.println("author" + child.elementText("author"));
      // 这行是为了格式化美观而存在
      System.out.println();
    }
  }
}

java解析xml有几种方法

DOM(Document Object Model)解析

优点

  • 允许应用程序对数据和结构做出更改
  • 访问是双向的,可以在任何时候在树中上、下导航获取、操作任意部分的数据 缺点
  • 解析XML文档的需要加载整个文档来构造层次结构,消耗内存资源大。 应用范围
  • 遍历能力强,常应用于XML文档需要频繁改变的服务中。 解析步骤
  1. 创建一个 DocumentBuilderFactory 对象
  2. 创建一个 DocumentBuilder 对象
  3. 通过 DocumentBuilderparse() 方法加载 XML 到当前工程目录下
  4. 通过 getElementsByTagName() 方法获取所有 XML 所有节点的集合
  5. 遍历所有节点
  6. 通过 item() 方法获取某个节点的属性
  7. 通过 getNodeName()getNodeValue() 方法获取属性名和属性值
  8. 通过 getChildNodes() 方法获取子节点,并遍历所有子节点
  9. 通过 getNodeName()getTextContent() 方法获取子节点名称和子节点值
package Paint;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DOMTest {
  public static void main(String[] args) {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try {
      DocumentBuilder db = dbf.newDocumentBuilder();
      Document document = db.parse("./src/Paint/hello.xml");
      NodeList bookList = document.getElementsByTagName("book"); // 节点集
      int bookCnt = bookList.getLength();
      System.err.println("一共获取到" + bookCnt + "本书");
      for (int i = 0; i < bookCnt; i++) {
        Node book = bookList.item(i);
        NamedNodeMap attrs = book.getAttributes();
        for (int j = 0; j < attrs.getLength(); j++) {
          Node attr = attrs.item(j);
          System.err.println(attr.getNodeName() + "---" + attr.getNodeValue()); // id
        }
        NodeList childNodes = book.getChildNodes();
        for (int k = 0; k < childNodes.getLength(); k++) {
          if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
            System.out.println(childNodes.item(k).getNodeName() + "---" + childNodes.item(k).getTextContent());
          }
        }
      }
    } catch (ParserConfigurationException e) {
      e.printStackTrace();
    } catch (SAXException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

SAX(Simple API for XML)解析

优点

  • 不需要等待所有的数据被处理,解析就可以开始
  • 只在读取数据时检查数据,不需要保存在内存中
  • 可以在某一个条件满足时停止解析,不必要解析整个文档
  • 效率和性能较高,能解析大于系统内存的文档 缺点
  • 解析逻辑复杂,需要应用层自己负责逻辑处理,文档越复杂程序越复杂
  • 单向导航,无法定位文档层次,很难同时访问同一文档的不同部分数据,不支持 XPath 解析步骤
  1. 获取一个 SAXParserFactory 的实例
  2. 通过 factory() 获取 SAXParser 实例
  3. 创建一个 handler() 对象
  4. 通过 parser 的 parse() 方法来解析 XML SAXTest.java
package Paint;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class SAXTest {
  public static void main(String[] args) {
    // 获取实例
    SAXParserFactory factory = SAXParserFactory.newInstance();
    try {
      SAXParser parser = factory.newSAXParser();
      SAXParserHandler handler = new SAXParserHandler();
      parser.parse("./src/Paint/hello.xml", handler);
      System.err.println("共有" + handler.getBookList().size() + "本书");
      for (Book book : handler.getBookList()) {
        System.out.println(book.getName());
        System.out.println("id=" + book.getId());
        System.out.println(book.getAuthor());
        System.out.println(book.getYear());
        System.out.println(book.getPrice());
        System.out.println(book.getLanguage());
      }
    } catch (ParserConfigurationException e) {
      e.printStackTrace();
    } catch (SAXException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

SAXParserHandler.java

package Paint;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXParserHandler extends DefaultHandler {
  String value = null;
  Book book = null;
  private ArrayList<Book> bookList = new ArrayList<Book>();
  public ArrayList<Book> getBookList() {
    return bookList;
  }
  /**
   * XML 解析开始
   */
  public void startDocument() throws SAXException {
    super.startDocument();
    System.out.println("xml 解析开始");
  }
  /**
   * XML 解析结束
   */
  public void endDocument() throws SAXException {
    super.endDocument();
    System.out.println("xml 解析结束");
  }
  /**
   * 解析 XML 元素开始
   */
  public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    super.startElement(uri, localName, qName, attributes);
    if (qName.equals("book")) {
      book = new Book();
      for (int i = 0; i < attributes.getLength(); i++) {
        System.out.println(attributes.getQName(i) + "---" + attributes.getValue(i));
        if (attributes.getQName(i).equals("id")) {
          book.setId(attributes.getValue(i));
        }
      }
    } else if (!qName.equals("bookstore")) {
      System.out.print("节点名:" + qName + "---");
    }
  }
  /**
   * 解析 XML 元素结束
   */
  public void endElement(String uri, String localName, String qName) throws SAXException {
    super.endElement(uri, localName, qName);
    if (qName.equals("book")) {
      bookList.add(book);
      book = null;
    } else if (qName.equals("name")) {
      book.setName(value);
    } else if (qName.equals("year")) {
      book.setYear(value);
    } else if (qName.equals("author")) {
      book.setAuthor(value);
    } else if (qName.equals("price")) {
      book.setPrice(value);
    } else if (qName.equals("language")) {
      book.setLanguage(value);
    }
  }
  public void characters(char[] ch, int start, int length) throws SAXException {
    super.characters(ch, start, length);
    // 获取节点值数组
    value = new String(ch, start, length);
    if (!value.trim().equals("")) {
      System.out.println("节点值:" + value);
    }
  }
}

JAVA 读取XML文件

import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XmlTester {
    public static void main(String[] args) throws DocumentException {
        // 使用了dom4j解析xml
        // 读取目录下用来测试的test.xml文件,取得xml主内容
        Document document = new SAXReader().read("src/abc/test.xml").getDocument();
        int i = 1;
        // 遍历文档根节点(wuxialist)下的子节点列表,即txtbook节点的集合
        for (Element txtbook : (List<Element>) document.getRootElement().elements()) {
            // 取得txtbook节点下的name节点的内容
            System.out.println(i + "." + txtbook.element("name").getText());
            i++; // 原来这里少些了这一行,先补上
        }
    }
}

java如何读取xml文件

xml解析还是用dom4j方便,

import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XMLPaser {
  public static void main(String[] args) {
    paserXML();
  }
  public static void paserXML() {
    SAXReader reader = new SAXReader();
    try {
      // 读取XML文件
      Document doc = reader.read("NewFile.xml");
      Element root = doc.getRootElement();
      System.out.println(root.getName());
      List<Element> param = root.elements();
      for (Element element : param) {
        if (element.attributeValue("name").equals("a")) {
          System.out.println(element.getText());
        }
      }
    } catch (DocumentException e) {
      e.printStackTrace();
    }
  }
}