java统计xml解析doc(纯JAVA实现xml数据生成解析)

发布时间:2022-11-14

本文目录一览:

  1. java xml解析,数据读取
  2. java XML解析详解
  3. 请问XML用java如何解析
  4. java中xml的解析有哪些
  5. java的xml的解析方式有什么,他们的解析流程是怎么样的,有什么区别

java xml解析,数据读取

SAXBuilder sb = new SAXBuilder(); // 建立构造器
Document doc;
try {
    doc = sb.build("E:/userinfod301.xml"); // 读入指定文件
    Element root = doc.getRootElement(); // 获得根节点
    List list = root.getChildren(); // 将根节点下的所有ObjectInstance子节点放入List中
    for (int i = 0; i < list.size(); i++) {
        List<Element> listNext = ((Element) list.get(i)).getChildren(); // 将ObjectInstance节点下的所有Attribute放入List中
        for (int j = 0; j < listNext.size(); j++) {
            Element sub = (Element) listNext.get(j); // 取得节点实例
            System.out.println(sub.getAttribute("name").getValue());
            System.out.println(sub.getText());
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

不知道是不是你想要的效果。

java XML解析详解

(I) Java通过DOM解析XML

  1. 得到DOM解析器的工厂实例
    DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
    
    得到 javax.xml.parsers.DocumentBuilderFactory 类的实例就是我们要的解析器工厂。
  2. 从DOM工厂获得DOM解析器
    DocumentBuilder dombuilder = domfac.newDocumentBuilder();
    
    通过 javax.xml.parsers.DocumentBuilderFactory 实例的静态方法 newDocumentBuilder() 得到 DOM 解析器。
  3. 把要解析的XML文档转化为输入流,以便DOM解析器解析它
    InputStream is = new FileInputStream("bin/library.xml");
    
    InputStream 是一个接口。
  4. 解析XML文档的输入流,得到一个Document
    Document doc = dombuilder.parse(is);
    
    由XML文档的输入流得到一个 org.w3c.dom.Document 对象,以后的处理都是对 Document 对象进行的。
  5. 得到XML文档的根节点
    Element root = doc.getDocumentElement();
    
    在DOM中只有根节点是一个 org.w3c.dom.Element 对象。
  6. 得到节点的子节点
    NodeList books = root.getChildNodes();
    for (int i = 0; i < books.getLength(); i++) {
        Node book = books.item(i);
    }
    
    这是用一个 org.w3c.dom.NodeList 接口来存放它所有子节点的,还有一种轮循子节点的方法,后面有介绍。
  7. 取得节点的属性值
    String email = book.getAttributes().getNamedItem("email").getNodeValue();
    System.out.println(email);
    
    注意,节点的属性也是它的子节点。它的节点类型也是 Node.ELEMENT_NODE
  8. 轮循子节点
    for (Node node = book.getFirstChild(); node != null; node = node.getNextSibling()) {
        if (node.getNodeType() == Node.ELEMENT_NODE) {
            if (node.getNodeName().equals("name")) {
                String name = node.getNodeValue();
                String name1 = node.getFirstChild().getNodeValue();
                ...
            }
            if (node.getNodeName().equals("price")) {
                String price = node.getFirstChild().getNodeValue();
                ...
            }
        }
    }
    

Java通过SAX解析XML

Simple API for XML(简称SAX) 是个循序存取XML的解析器API。 一个实现SAX的解析器(也就是“SAX Parser”)以一个串流解析器的型式作用,拥有事件驱动API。由使用者定义回调函数,解析时,若发生事件的话会被调用。SAX事件包括:

  • XML 文字节点
  • XML 元素节点
  • XML 处理指令

示例XML结构

<person>
    <user>
        <username>谢成志</username>
        <password>6626310xie</password>
        <sex>男</sex>
        <birthday>1988/11/28</birthday>
        <headpic>
            <pictitle>ermao</pictitle>
            <picurl>images/head1.jpg</picurl>
        </headpic>
    </user>
</person>

此为下面即将解析的简单XML结构,并将其封装成一个 User 对象。

Java代码示例

package com.xcz.xml;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import com.xcz.util.SaxUtil;
public class Sax4XML {
    public static void main(String[] args) {
        try {
            // 1. 获取factory
            SAXParserFactory factory = SAXParserFactory.newInstance();
            // 2. 获取parser
            SAXParser parser = factory.newSAXParser();
            // 3. 获取解析时的监听器对象
            SaxUtil su = new SaxUtil();
            // 4. 开始解析
            parser.parse(new File("src/user-params.xml"), su);
            System.out.println(su.getUser());
        } catch (ParserConfigurationException | SAXException | IOException e) {
            e.printStackTrace();
        }
    }
}

SaxUtil类

package com.xcz.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.xcz.po.HeadPic;
import com.xcz.po.User;
public class SaxUtil extends DefaultHandler {
    private User user;
    private HeadPic headPic;
    private String content;
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        content = new String(ch, start, length);
    }
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
    }
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }
    @Override
    public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
        if ("user".equals(name)) {
            user = new User();
        }
        if ("headpic".equals(name)) {
            headPic = new HeadPic();
        }
    }
    @Override
    public void endElement(String uri, String localName, String name) throws SAXException {
        if ("username".equals(name)) {
            user.setUsername(content);
        }
        if ("password".equals(name)) {
            user.setPassword(content);
        }
        if ("sex".equals(name)) {
            user.setSex(content);
        }
        if ("birthday".equals(name)) {
            try {
                user.setBirthday(sdf.parse(content));
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        if ("pictitle".equals(name)) {
            headPic.setPicTitle(content);
        }
        if ("picurl".equals(name)) {
            headPic.setPicUrl(content);
            user.setHeadPic(headPic);
        }
    }
    public User getUser() {
        return user;
    }
}

[优点]

  1. 节约内存开销 SAX解析器在某些方面优于DOM风格解析器,因为SAX解析器的内存使用量一般远低于DOM解析器使用量。DOM解析器在任何处理开始之前,必须将XML以整棵树放在内存,所以DOM解析器的内存使用量完全根据输入资料的大小。相对来说,SAX解析器的内存内容,是只基于XML档案的最大深度(XML树的最大深度)和单一XML项目上XML属性储存的最大资料。
  2. 解析速度快 因为SAX事件驱动的本质,处理文件通常会比DOM风格的解析器快。

[缺点]

SAX事件驱动的模型对于XML解析很有用,但它确实有某些缺点。 某些种类的XML验证需要访问整份文件。例如,一个DTD IDREF属性需要文件内有项目使用指定字符串作为DTD ID属性。要在SAX解析器内验证,必须追踪每个之前遇过的ID和IDREF属性,检查是否有任何相符。更甚者,一个IDREF找不到对应的ID,使用者只会在整份文件都解析完后才发现,若这种连接对于建立有效输出是重要的,那用在处理整份文件的时间只是浪费。

请问XML用java如何解析

我是使用DOM解析XML文档。。。希望对你有用。

XML简单使用的代码

package com.osekj.music;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.*;
public class TestDOM {
    public static void main(String[] args) {
        // 1、得到DOM解析器的工厂实例
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            // 2、从DOM工厂获得DOM解析器
            DocumentBuilder db = dbf.newDocumentBuilder();
            // 3、解析XML文档,得到一个Document,即DOM树
            Document doc = db.parse("my.xml"); // 项目下的XML文件
            // 4、得到所有DOG节点列表信息
            NodeList dogList = doc.getElementsByTagName("dog");
            System.out.println("xml文档中共有" + dogList.getLength() + "条狗狗信息");
            // 5、轮循狗狗信息
            for (int i = 0; i < dogList.getLength(); i++) {
                // 5.1、获取第i个狗狗元素信息
                Node dog = dogList.item(i);
                // 5.2、获取第i个狗狗元素的id属性的值并输出
                Element element = (Element) dog;
                String attrValue = element.getAttribute("id");
                System.out.println("id:" + attrValue);
                // 5.3、获取第i个狗狗元素的所有子元素的名称和值并输出
                for (Node node = dog.getFirstChild(); node != null; node = node.getNextSibling()) {
                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                        String name = node.getNodeName();
                        String value = node.getTextContent();
                        System.out.print(name + ":" + value + "\t");
                    }
                }
                System.out.println();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

java中xml的解析有哪些

(I) Java通过DOM解析XML

  1. 得到DOM解析器的工厂实例
    DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
    
    得到 javax.xml.parsers.DocumentBuilderFactory 类的实例就是我们要的解析器工厂。
  2. 从DOM工厂获得DOM解析器
    DocumentBuilder dombuilder = domfac.newDocumentBuilder();
    
    通过 javax.xml.parsers.DocumentBuilderFactory 实例的静态方法 newDocumentBuilder() 得到 DOM 解析器。
  3. 把要解析的XML文档转化为输入流,以便DOM解析器解析它
    InputStream is = new FileInputStream("bin/library.xml");
    
    InputStream 是一个接口。
  4. 解析XML文档的输入流,得到一个Document
    Document doc = dombuilder.parse(is);
    
    由XML文档的输入流得到一个 org.w3c.dom.Document 对象,以后的处理都是对 Document 对象进行的。
  5. 得到XML文档的根节点
    Element root = doc.getDocumentElement();
    
    在DOM中只有根节点是一个 org.w3c.dom.Element 对象。
  6. 得到节点的子节点
    NodeList books = root.getChildNodes();
    for (int i = 0; i < books.getLength(); i++) {
        Node book = books.item(i);
    }
    

java的xml的解析方式有什么,他们的解析流程是怎么样的,有什么区别

答:4种。(或者说是两种,因为JDOM和DOM4J是DOM的两个特殊情况)

1. SAX解析

解析方式是事件驱动机制! SAX解析器,逐行读取XML文件解析,每当解析到一个标签的开始/结束/内容/属性时,触发事件。 可以在这些事件发生时,编写程序进行相应的处理。

优点:

  • 分析能够立即开始,而不是等待所有的数据被处理。
  • 逐行加载,节省内存,有助于解析大于系统内存的文档。
  • 有时不必解析整个文档,它可以在某个条件得到满足时停止解析。

缺点:

  1. 单向解析,无法定位文档层次,无法同时访问同一个文档的不同部分数据(因为逐行解析,当解析第n行时,第n-1行已经被释放了,无法再对其进行操作)。
  2. 无法得知事件发生时元素的层次,只能自己维护节点的父/子关系。
  3. 只读解析方式,无法修改XML文档的内容。

2. DOM解析

是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个文档和内存中建立文档树模型。程序员可以通过操作文档树,来完成数据的获取、修改、删除等。

优点:

  • 文档在内存中加载,允许对数据和结构做出更改。访问是双向的,可以在任何时候在树中双向解析数据。

缺点:

  • 文档全部加载在内存中,消耗资源大。

3. JDOM解析

目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。 JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”(根据学习曲线假定为20%)。

优点:

  • 使用具体类而不是接口,简化了DOM的API。
  • 大量使用了Java集合类,方便了Java开发人员。

缺点:

  • 没有较好的灵活性。
  • 性能不是那么优异。

4. DOM4J解析

它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML。 目前许多开源项目中大量采用DOM4J,例如:Hibernate。