欢迎访问宙启技术站
智能推送

使用Java函数来读取和处理XML数据

发布时间:2023-06-08 16:09:03

XML (Extensible Markup Language) 可被广泛用于存储和传输数据。在Java中,我们可以使用许多第三方库来读取和处理XML数据 。本文将介绍如何使用Java函数来读取和处理XML数据,重点是介绍了Java内置库中的DOM和SAX两种方式。

一、DOM

DOM是Java内置的解析器,可以解析XML文件,生成一个树形的结构,整个XML文档被装载到内存中,占用的内存较多。

1.读取XML文件

要读取XML文件,可以使用DOM提供的DocumentBuilderFactory和DocumentBuilder类来创建一个新的Document对象,从而将整个XML文件解析到内存中。

// 创建DocumentBuilderFactory对象

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

// 使用factory创建新的DocumentBuilder对象

DocumentBuilder builder = factory.newDocumentBuilder();

// 使用builder的parse方法将XML文件解析为一个Document对象

Document document = builder.parse(new File("example.xml"));

2.访问XML元素

一旦我们获取了Document对象,可以使用它的函数来访问整个XML文档。例如,可以使用document.getElementsByTagName()方法返回一个节点列表,该节点列表包含符合指定名称的所有元素。

// 获取所有 "book" 元素

NodeList nodeList = document.getElementsByTagName("book");

// 遍历所有 "book" 元素

for (int i = 0; i < nodeList.getLength(); i++) {

    Element element = (Element) nodeList.item(i);

    // 获取 book id 属性值

    String id = element.getAttribute("id");

    System.out.println("book id : " + id);

    // 获取 title 元素

    String title = element.getElementsByTagName("title").item(0).getTextContent();

    System.out.println("Title : " + title);

    // 获取 author 元素

    String author = element.getElementsByTagName("author").item(0).getTextContent();

    System.out.println("Author : " + author);

    // 获取 year 元素

    String year = element.getElementsByTagName("year").item(0).getTextContent();

    System.out.println("Year : " + year);

    // 获取 price 元素

    String price = element.getElementsByTagName("price").item(0).getTextContent();

    System.out.println("Price : " + price);

}

3.修改XML元素

DOM提供了一些更新方法,可以使用它们来更改XML文档中的节点。例如,可以使用Element.setTextContent()方法来更新元素的内容。

// 获取第一个 "book" 元素

Element element = (Element) document.getElementsByTagName("book").item(0);

// 更新价格

element.getElementsByTagName("price").item(0).setTextContent("20.00");

// 将更新后的XML文档输出到控制台

TransformerFactory transformerFactory = TransformerFactory.newInstance();

Transformer transformer = transformerFactory.newTransformer();

transformer.setOutputProperty(OutputKeys.INDENT, "yes");

DOMSource source = new DOMSource(document);

StreamResult consoleResult = new StreamResult(System.out);

transformer.transform(source, consoleResult);

二、SAX

SAX是另一种解析XML文件的方式。与DOM不同,SAX不会将整个XML文档解析到内存中。相反,它使用事件驱动方法流式读取XML文档,从而在解析XML文档时节省内存。

1.创建SAXParser

要使用SAX解析XML文件,需要一个SAXParser对象。可以使用SAXParserFactory.newInstance()方法创建一个新的SAXParserFactory对象,然后调用它的newSAXParser()方法返回一个新的SAXParser对象。

// 创建SAXParserFactory对象

SAXParserFactory factory = SAXParserFactory.newInstance();

// 使用factory创建新的SAXParser对象

SAXParser saxParser = factory.newSAXParser();

2.解析XML文件

使用saxParser的parse()方法解析XML文件,解析器会从流中读取XML文档,当解析器遇到XML的开始和结束标签时,它将触发一个事件,可以使用处理程序 (handler) 对这些事件进行响应。

// 创建新的SAX处理程序

DefaultHandler handler = new DefaultHandler() {

    boolean btitle = false;

    boolean bauthor = false;

    boolean byear = false;

    boolean bprice = false;

    @Override

    public void startElement(String uri, String localName,String qName,

            Attributes attributes) throws SAXException {

        if (qName.equalsIgnoreCase("title")) {

            btitle = true;

        }

        if (qName.equalsIgnoreCase("author")) {

            bauthor = true;

        }

        if (qName.equalsIgnoreCase("year")) {

            byear = true;

        }

        if (qName.equalsIgnoreCase("price")) {

            bprice = true;

        }

    }

    @Override

    public void characters(char ch[], int start, int length) throws SAXException {

        if (btitle) {

            System.out.println("Title : " + new String(ch, start, length));

            btitle = false;

        }

        if (bauthor) {

            System.out.println("Author : " + new String(ch, start, length));

            bauthor = false;

        }

        if (byear) {

            System.out.println("Year : " + new String(ch, start, length));

            byear = false;

        }

        if (bprice) {

            System.out.println("Price : " + new String(ch, start, length));

            bprice = false;

        }

    }

 };

 // 使用默认的处理程序解析XML文件

 saxParser.parse(new File("example.xml"), handler);

三、总结

本文介绍了如何使用Java函数来读取和处理XML数据,重点介绍了Java内置库中的DOM和SAX两种方式。DOM提供了一种简单的方式来处理XML文档,而SAX则提供了一种更节省内存的方法来处理XML文档。选择哪种方式取决于您的需要和对内存的敏感度 。