JAVA SE 读写XML——DOM

DOM

主要用的的类

  • Document:接口
  • DocumentBuilder:
  • DocumentBuilderFactory:

Document接口

常用方法

  • Attr createAttribute(String name) //创建给定名称的属性
  • Attr createAttributeNS(String namespaceURI, String qualifiedName) //创建给定的限定名称和名称空间 URI 的属性
  • DocumentFragment createDocumentFragment() //创建空 DocumentFragment 对象
  • Element createElement(String tagName) //创建指定类型的子节点
  • Element createElementNS(String namespaceURI, String qualifiedName) //创建给定的限定名称和名称空间 URI 的元素
  • Text createTextNode(String data) //创建给定指定字符串的 Text 节点
  • Element getDocumentElement() //该属性允许直接访问文档的文档元素的子节点。
  • Element getElementById(String elementId) //返回具有带给定值的 ID 属性的 Element
  • Node renameNode(Node n, String namespaceURI, String qualifiedName) //重命名 ELEMENT_NODE 或 ATTRIBUTE_NODE 类型的现有节点

DocumentBuilder类:

定义 API, 使其从 XML 文档获取 DOM 文档实例

构造方法

  • DocumentBuilder()

常用方法

  • abstract boolean isValidating() //指示此解析器是否被配置为验证 XML 文档
  • abstract Document newDocument() //获取 DOM Document 对象的一个新实例来生成一个 DOM 树
  • Document parse(File f) //将给定文件的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象
  • Document parse(InputStream is) //将给定 InputStream 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象
  • Document parse(InputStream is, String systemId) //将给定 InputStream 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象
  • Document parse(String uri) //将给定 URI 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象
  • void reset() //将此 DocumentBuilder 重置为其原始配置
  • abstract void setEntityResolver(EntityResolver er) 指定使用 EntityResolver 解析要解析的 XML 文档中存在的实体

DocumentBuilderFactory类

定义工厂 API,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器

构造方法

  • DocumentBuilderFactory() //用于阻止实例化的受保护构造方法

常用方法

  • abstract Object getAttribute(String name) //允许用户在底层实现上检索特定属性
  • abstract DocumentBuilder newDocumentBuilder() //使用当前配置的参数创建一个新的 DocumentBuilder 实例。
  • static DocumentBuilderFactory newInstance() //获取 DocumentBuilderFactory 的新实例。
  • static DocumentBuilderFactory newInstance(String factoryClassName, ClassLoader classLoader) //从类名称中获取新的 DocumentBuilderFactory 实例
  • abstract void setAttribute(String name, Object value) //允许用户在底层实现上设置特定属性
  • void setCoalescing(boolean coalescing) //指定由此代码生成的解析器将把 CDATA 节点转换为 Text 节点,并将其附加到相邻(如果有)的 Text 节点。
  • void setExpandEntityReferences(boolean expandEntityRef) //指定由此代码生成的解析器将扩展实体引用节点。
  • abstract void setFeature(String name, boolean value) //设置由此工厂创建的此 DocumentBuilderFactory 和 DocumentBuilder 的功能。
  • void setIgnoringComments(boolean ignoreComments) //指定由此代码生成的解析器将忽略注释。
  • void setIgnoringElementContentWhitespace(boolean whitespace) //由此工厂创建的解析器在解析 XML 文档时,必须删除元素内容中的空格(有时也可以称作“可忽略空格”,请参阅 XML Rec 2.10)。
  • void setNamespaceAware(boolean awareness) //指定由此代码生成的解析器将提供对 XML 名称空间的支持。
  • void setSchema(Schema schema) //设置将由解析器使用的 Schema,该解析器从此工厂创建。
  • void setValidating(boolean validating) //指定由此代码生成的解析器将验证被解析的文档。
  • void setXIncludeAware(boolean state) //设置 XInclude 处理的状态

 实例应用

//读取xml

package TESTXML;

import org.w3c.dom.*;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.IOException;

public class testDom {
    public static void main(String[] args) {
        textDom test = new textDom();
        test.createXml();
    }
    
    //创建指定文件
    public DocumentBuilder getDocumentBuilder() {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = null;
        try {
            db = dbf.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        return db;
    }

    //解析xml文件
    public void xmlParser() {
        try {
            Document document = getDocumentBuilder().parse("books.xml");
            NodeList booklist = document.getElementsByTagName("book");

            //1、未知类型,获取属性名,属性值
            for (int i = 0; i < booklist.getLength(); i++) {
                Node book = booklist.item(i);
                NamedNodeMap attrs = book.getAttributes();
                System.out.println("————————第" + (i + 1) + "本书———————");
                for (int j = 0; j < attrs.getLength(); j++) {
                    Node attr = attrs.item(j);
                    System.out.println("| 属性名: " + attr.getNodeName());
                    System.out.println("| 属性值: " + attr.getNodeValue());

                }
            }

            //2、已知存在book节点,获取id属性值
            for (int i = 0; i < booklist.getLength(); i++) {
                Element book = (Element) booklist.item(i);//知道有这个id类型
                String attrValue = book.getAttribute("id");
                System.out.println("id的属性值:" + attrValue);
            }

            //3、获取节点名、节点值
            for (int i = 0; i < booklist.getLength(); i++) {
                Node book = booklist.item(i);
                NodeList childNodes = book.getChildNodes();
                System.out.println("——————第" + (i + 1) + "本书共有" 
                    + childNodes.getLength() + "子节点——————");//换行和空格也算
                for (int k = 0; k < childNodes.getLength(); k++) {
                    //获取element类型的节点名
                    if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
                        System.out.print("第" + (k + 1) + "个节点名:" 
                            + childNodes.item(k).getNodeName() + "  节点值是:");
                        System.out.println(childNodes.item(k).getFirstChild().getTextContent());//继续获取子节点
                    }
                }
            }
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //生成xml文件
    public void createXml() {
        DocumentBuilder db = getDocumentBuilder();
        Document document = db.newDocument();
        //document.setXmlStandalone(true);//去掉standalone
        Element bookstore = document.createElement("bookStore");
        Element book = document.createElement("book");//创建节点
        Element name = document.createElement("name");
        book.appendChild(name);//添加子节点
        name.setTextContent("max");//设置文本内容
        book.setAttribute("id", "1");//设置节点属性
        bookstore.appendChild(book);
        document.appendChild(bookstore);

        TransformerFactory tff = TransformerFactory.newInstance();
        try {
            Transformer tf = tff.newTransformer();
            tf.setOutputProperty(OutputKeys.INDENT, "yes");//设置输入格式换行
            tf.transform(new DOMSource(document), new StreamResult(new File("book.xml")));
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }
}

相关文章——读写xml系列方式

猜你喜欢

转载自blog.csdn.net/weixin_38500325/article/details/81429528