XML是一种数据格式,那么需要对XML文件进行操作就需要用到XML解析器---------针对dom方式和sax方式提供了不同的解析技术-----需要不同的XML解析器

 dom方式:会把文档中所有元素(标签),根据xml的层级结构,解析成各个Node对象(节点)。在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象

    缺点:如果文件过大,造成内存溢出。

    优点:树结构,容易遍历和实现增删改。

 sax方式:采用事件驱动,边读边解析,解析到某一个对象,返回对象名称,可以由用户自己建立自己的对象模型。SAX可以在解析文档的任意时刻停止解析。

    缺点:不能对节点实现增删改操作。

    优点:不受文件大小限制,方便实现查询操作。

DOM(Documeng Object Model)解析器-------JAXP(Java API for XMLProcessing,意为XML处理的Java API)------Java自带的解析xml接口

    解析器存在于------JDK的javax.xml.parsers 包中

      dom方式:DocumentBuilder  : dom解析器类,

           DocumentBuilderFactory:dom解析工厂类

   过程:通过查看API可以发现,而DocumentBuilderFactory是个抽象类,但存在newInstance()方法通过反射的方式得到该接口的实例对象。

 DocumentBuilder是个抽象类,可以通过 DocumentBuilderFactory.newDocumentBuilder()方法得到解析器实例。

 该解析器类存在 parse(File f) 方法返回Document对象,还存在parse(String uri)方法也返回一个Document对象

 而Doucument是个接口,其父接口是Node接口,Document和Node存在一些方法对标签进行操作,详细查看API 。

        getElementsByTagName(String tagname):获取标签, 返回的是 NodeList 集合

        createElement(String tagName):创建标签

        createTextNode(String data):创建文本

        appendChild(Node newChild):将文本添加到标签下面

        removeChild(Node oldChild):删除节点

        getParentNode() :获取父节点

        getTextContent():得到标签里面的内容 

static Document getdocument() throws Exception {
 // 通过工厂解析器类得到Doucment对象
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder = builderFactory.newDocumentBuilder();
  // parse()解析xml,返回document 
return documentbuilder.parse(URL);
}
//docuent及其父接口Node有诸多操作标签/属性/文本内容的方法
看具体要求选用具体方法
注意:删除元素需要得到----该元素的父节点删除,不能自己删自己
   在编译器中的增删改----都是对内存操作--因此都需要回写到具体文件中
//回写操作
static void writer(Document document) throws Exception {
  TransformerFactory factory = TransformerFactory.newInstance();
  Transformer transformer = factory.newTransformer();
  transformer.transform(new DOMSource(document), new StreamResult(URL));
}

   sax方式:SAXParser : 解析器类

       SAXParserFactory : 解析器工厂类

 过程:查看API可以发现,SAXParserFactory是个抽象类,可以通过反射的方式newInstance()方法得到该类实例对象。

   SAXParser也是个抽象类, 其实例对象可以通过SAXParserFactory.newSAXParser()得到解析器实例。

   SAXParser对象中存在---parse(File f, DefaultHandler dh)----解析使用指定的指定XML文件的内容DefaultHandler

默认事件自动处理其中存在三个方法:解析开始标签---startElement(String uri, String localName, String qName, Attributes attributes)----返回标签名称

   解析文本内容----characters(char[] ch,int start,int length)------通过string的构造方法,返回文本内容

   解析结束标签-----endElement(String uri,String localName, String qName)-------返回结束标签

         参数File --------xml的路径

         DefaultHandler----默认事件处理器

class MyDefaultHandler extends DefaultHandler {
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
System.out.print("<"+qName+">");//输出返回的开始标签
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
System.out.print(new String(ch,start,length));输出返回的结束标签
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.print("<"+qName+">");输出返回的文本内容
}
}

    

DOM4J(Document Object Model for Java):是dom4j组织提供的一个用来解析处理XML、 XPath和XSLT开源框架,需要导包--dom4j-2.1.1.jar。DOM4J使用接口和抽象基本类方法,hibernate框架使用的解析方式就是DOM4J,该网址可下载dom4j的JAR包------------https://dom4j.github.io-----哈哈哈哈,该网站能快速掌握Dom4j解析器的使用。

   Dom4J中提供如些对象和方法对XML操作:

    SAXReader():SAXReader可以通过多种方式读取xml数据,并返回Document格式的对象。

    Document对象:getRootElement() :获取根节点 ,返回的是Element。

    Element是个接口对象,父接口是Node:getParent():获取父节点

                 addElement():添加标签

                 elements():获取标签下面的所有一层子标签

                 elements(qname):获取标签下面一层中名为qname的子标签

                 element(qname):表示获取表面下面的第一个子标签

                 addElement("xxx"):表示创建名为XXX的子标签

                 setText("YYY"):表示添加值为YYY的标签内容

                 addAttribute("name", "James"):表示添加属性

        对XPath支持--------------selectNodes("xpath表达式"): 多个节点

                    selectSingleNode("xpath表达式"):一个节点

       

SAXReader reader = new SAXReader();  //注意导包----dom4j的import org.dom4j.Document;

Document document = reader.read(url);//import org.dom4j.io.SAXReader;
  

// 1、创建解析器
SAXReader saxReader = new SAXReader();
// 2、得到document
Document document = saxReader.read("src/DTD.xml");
// 3、得到根节点
Element element = document.getRootElement();
// 4、获取到第一个person
// 使用element方法
Element elementperson = element.element("person");
// 5、在p1下面添加元素
// 在p1上面直接使用 addElement("标签名称")方法 返回一个Element
Element addelement = elementperson.addElement("段位");
// 6、在添加完成之后的元素下面添加文本
// 在sex上直接使用 setText("文本内容")方法
addelement.setText("黄金");
// 7、回写xml
// 格式化 OutputFormat,使用 createPrettyPrint方法,表示一个漂亮的格式
// 使用类XMLWriter 直接new 这个类 ,传递两个参数
// 第一个参数是xml文件路径 new FileOutputStream("路径")
// 第二个参数是格式化类的值

对XML文件进行修改------需要将修改的内容写到文件

//将修改内容写道文本对象中

方式一FileWriter out = new FileWriter("src/DTD.xml");

    document.write(out);

    out.close();

方式二:将修改内容有格式的写入到文档

    FileWriter fileWiter = new FileWriter("src/DTD.xml");

    XMLWriter writer = new XMLWriter(fileWiter);

    writer.write( document );

    writer.close();

//将修改内容有格式的写入到文档中---有格式

方式三:OutputFormat format = OutputFormat.createPrettyPrint();

    XMLWriter writer = new XMLWriter(new FileOutputStream("src/DTD.xml"),format);

         writer.write(document);
         writer.close();

DTD.xml文件

<history>
  <person>
    <name>貂蝉</name>
    <age>16</age>
    <段位>黄金</段位>
  </person>
  <person>
    <name>皇后</name>
    <name>杨贵妃</name>
    <age>20</age>
  </person>
  <person>
    <name>妃子</name>
    <name>落雁</name>
    <age>19</age>
  </person>
</history>

    Dom4j中可以使用元素迭代器来遍历下一层的元素和属性:elementIterator()----attributeIterator()---hasNext()

     Dom4j中支持XPath语法:不过,需要的导包jaxen-1.2.0.jar---下载路径----https://mvnrepository.com/artifact/jaxen/jaxen/1.2.0

      第一种形式 -----/AAA/DDD/BBB: 表示一层一层的,AAA下面 DDD下面的BBB

        第二种形式---------//BBB: 选取所有 BBB 子元素,而不管它们在文档中的位置。

        第三种形式----------------/*: 所有元素

       第四种形式-----------------BBB[1]: 表示第一个BBB元素  BBB[last()]:表示最后一个BBB元素

      第五种形式--------------//BBB[@id]: 表示只要BBB元素上面有id属性,都得到

      第六种形式----------- //BBB[@id='b1'] 表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1

     常见这六种----详细查看-----https://www.w3school.com.cn/xpath/xpath_syntax.asp

         //1、创建解析器
SAXReader reader = new SAXReader();
//2、得到document
Document document = reader.read("src/DTD.xml");
//3、得到根节点 getRootElement() 返回Element
Element element = document.getRootElement();
//Xpath查询
  Node node = document.selectSingleNode("//name[1]");
//修改name元素的值为独孤求败
  node.setText("独孤求败");
/*
* List<Node> list = element.selectNodes("//name");
* list for(Node node :
* list) { System.out.println(node.getText()); }
*/
//回写文档中
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream("src/DTD.xml"),format);
writer.write(document);
writer.close();

参考笔记:https://www.cnblogs.com/linkworld/p/7565533.html

XML解析器之JAXP与DOM4J的更多相关文章

  1. XML 解析之 jaxp 解析器

    XML 的解析方式有两种方式: DOM 解析和 SAX 解析. DOM 解析: 根据 XML 的层级结构, 在内存中分配一个树形结构, 把 XML 的标签, 属性和文本都封装成对象. 优点: 可以实现 ...

  2. XML解析之JAXP

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  3. XML解析之JAXP案例详解

    根据一个CRUD的案例,对JAXP解析xml技术,进行详细的解释: 首先,已知一个xml文件中的数据如下: <?xml version="1.0" encoding=&quo ...

  4. XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax

    本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...

  5. JAVA基础学习之XMLCDATA区、XML处理指令、XML约束概述、JavaBean、XML解析(8)

    1.CDATA区在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理.遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直 ...

  6. XML解析【介绍、DOM、SAX详细说明、jaxp、dom4j、XPATH】

    什么是XML解析 前面XML章节已经说了,XML被设计为"什么都不做",XML只用于组织.存储数据,除此之外的数据生成.读取.传送等等的操作都与XML本身无关! XML解析就是读取 ...

  7. Java XML解析工具 dom4j介绍及使用实例

    Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...

  8. 【Java】XML解析之DOM4J

    DOM4J介绍 dom4j是一个简单的开源库,用于处理XML. XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM,SAX和JAXP,使用需要引用dom4j.jar包 ...

  9. xml解析方式之JAXP解析入门

    XML解析 1 引入 xml文件除了给开发者看,更多的情况使用[程序读取xml文件]的内容.这叫做xml解析 2 XML解析方式(原理不同) DOM解析 SAX解析 3 XML解析工具 DOM解析原理 ...

随机推荐

  1. thinkphp 表达式查询

    上面的查询条件仅仅是一个简单的相等判断,可以使用查询表达式支持更多的SQL查询语法,也是ThinkPHP查询语言的精髓,查询表达式的使用格式: $map['字段名'] = array('表达式','查 ...

  2. ThinkPHP可以支持直接使用字符串作为查询条件

    ThinkPHP可以支持直接使用字符串作为查询条件,但是大多数情况推荐使用数组或者对象来作为查询条件,因为会更加安全. 大理石平台哪家好 一.使用字符串作为查询条件 这是最传统的方式,但是安全性不高, ...

  3. 【Codeforces Round #424 (Div. 2) D】Office Keys

    [Link]:http://codeforces.com/contest/831/problem/D [Description] 有n个人,它们都要去一个终点,终点位于p; 但是,在去终点之前,他们都 ...

  4. python网络框架Twisted

    什么是Twisted Twisted是一个用python语言写的事件驱动网络框架,它支持很多种协议,包括UDP,TCP,TLS和其他应用层协议,比如HTTP,SMTP,NNTM,IRC,XMPP/Ja ...

  5. MySQL 中LIMIT的使用详解

    在使用数据库过程中,常会遇到查询或者导出某个数据表或者查询集的前几条或者后几条记录,LIMIT可以很好的满足需求. LIMIT基本语法: 如果只给定一个参数,表示记录数. mysql; ) 相当于 m ...

  6. 微信公众号 SVG长按互动

    <section class="" style="display: block;width: 100%;height:667px;overflow:hidden;m ...

  7. android 头像选择以及裁剪

    一.布局申明 <ImageView android:id="@+id/head_image" android:layout_width="80dp" an ...

  8. VS2012 TFS 解决计算机改名无法连接TFS的问题

      闲着没事改了下计算机名字,结果造成TFS无法连接. 报错讯息如下: ---------------------------Microsoft Visual Studio-------------- ...

  9. C++中无数据成员的类的对象占用内存大小

    结论: 对于没有数据成员的对象,其内存单元也不是0,c++用一个内存单元来表示这个实例对象的存在. 如果有了数据或虚函数(虚析构函数),则相应的内存替代1标记自己的存在. PS:以下代码均在win32 ...

  10. maven错误:is duplicated in the reactor

    code-instrument-java git:(masterv2-2.2.2-solr) ✗ mvn clean package -Dmaven.test.skip=true [INFO] Sca ...