使用jaxp进行dom解析_动力节点Java学院整理

1.javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回

2.调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。

3.调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

4.调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

案例1.遍历xml文件中跟节点下面的所有子节点.

1.xml的约束文件Java.dtd

<!ELEMENT classes (java班,net班,php班,ios班)>
<!ELEMENT java班 (teachers?,students?)>
<!ELEMENT net班 (teachers?,students?)>
<!ELEMENT php班 (teachers?,students?)>
<!ELEMENT ios班 (teachers?,students?)>
<!ELEMENT teachers (teacher*)>
<!ELEMENT teacher EMPTY>
<!ELEMENT students (student*)>
<!ELEMENT student (name,sex,age)>
<!ATTLIST java班 name CDATA #IMPLIED>
<!ATTLIST net班 name CDATA #IMPLIED>
<!ATTLIST php班 name CDATA #IMPLIED>
<!ATTLIST ios班 name CDATA #IMPLIED>
<!ATTLIST teacher name CDATA #IMPLIED>
<!ATTLIST teacher sex CDATA #IMPLIED>
<!ATTLIST teacher age CDATA #IMPLIED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST student id ID #IMPLIED> 

2.xml文件内容如下java.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE classes SYSTEM "bin//parsers//java.dtd">
<classes>
  <java班 name="CSDNJava01班">
    <teachers>
      <teacher name="军哥" sex="男" age="28" />
      <teacher name="刘丽华" sex="女" age="28" />
    </teachers>
    <students>
      <student id="x121">
        <name>王亮</name>
        <sex>女</sex>
        <age>28</age>
      </student>
    </students>
  </java班>
  <!-- 注释0 -->
  <net班 name="CSDNNet01班">xxx</net班>
  <php班 name="CSDNPhp01班"></php班>
  <ios班 name="CSDNIos01班"></ios班>
</classes>
<!-- 对java.xml文件进行CRUD的操作 -->
<!-- 节点
    nodeName      nodeValue    nodeType
element 标签名        null       1
Attr   属性名       属性值      2
text   #text        文本的值     3
 --> 

3.遍历xml文件的操作

//1.获取XML的根节点对象
@Test
  public void test() throws ParserConfigurationException, SAXException, IOException{
    //调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    //调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象
    DocumentBuilder builder = builderFactory.newDocumentBuilder();
    //通过文件的方式获取Document对象
    /*File file = new File("src//parsers//java.xml");
    System.out.println(file+"----");
    Document document = builder.parse(file);*/
    //解析指定的文件
    InputStream is= this.getClass().getClassLoader()
               .getResourceAsStream("parsers//java.xml");
    Document document = builder.parse(is); 

    //document.getDocumentElement()获取根节点的元素对象
    Element root = document.getDocumentElement();
    //遍历根节点下面的所有子节点
    listNodes(root);
  } 

2.遍历节点对象的方法

/**
   * 遍历根据节点对象下面的所有的节点对象
   * @param node
   */
  public void listNodes(Node node) {
    // 节点是什么类型的节点
    if (node.getNodeType() == Node.ELEMENT_NODE) {// 判断是否是元素节点
      Element element = (Element) node;
      //判断此元素节点是否有属性
      if(element.hasAttributes()){
        //获取属性节点的集合
        NamedNodeMap namenm =  element.getAttributes();//Node
        //遍历属性节点的集合
        for(int k=0;k<namenm.getLength();k++){
          //获取具体的某个属性节点
          Attr attr = (Attr) namenm.item(k);
          System.out.println("name:::"+attr.getNodeName()+" value::"
                   +attr.getNodeValue()+" type::"+attr.getNodeType());
        }
      }
      //获取元素节点的所有孩子节点
      NodeList listnode = element.getChildNodes();
      //遍历
      for (int j = 0; j < listnode.getLength(); j++) {
        //得到某个具体的节点对象
        Node nd = listnode.item(j);
        System.out.println("name::" + nd.getNodeName() + " value:::"
            + nd.getNodeValue() + " type:::" + nd.getNodeType());
        //重新调用遍历节点的操作的方法
        listNodes(nd);
      } 

    }
  } 

4.查询某个节点对象(简单列举一些案例)

/**
 * 根据标签的名称查找所有该名称的节点对象
 */
public void findNode(Document document) {
  //根据标签名称获取该名称的所有节点对象
  NodeList nodelist = document.getElementsByTagName("teacher");
  //遍历
  for (int i = 0; i < nodelist.getLength(); i++) {
    //得到具体的某个节点对象
    Node node = nodelist.item(i);
    System.out.println(node.getNodeName());
  }
} 

/**
 * 根据属性的值 查询某个节点对象
 * 属性值是唯一(假设)
 * @param document
 * @param value
 * @return
 */
public Node findNodeByAttrValue(Document document, String value) {
  //根据标签名称获取该名称的节点对象集合
  NodeList nodelist = document.getElementsByTagName("teacher");
  //遍历
  for (int i = 0; i < nodelist.getLength(); i++) {
    //获取某个具体的元素节点对象
    Element node = (Element) nodelist.item(i);
    //根据属性名称获取该节点的属性节点对象
    Attr attr = node.getAttributeNode("name");
    //获取属性节点的值是否给指定的节点属性值相同
    if (attr.getNodeValue().equals(value)) {
      //返回此节点
      return node;
    }
  }
  return null;
} 

/**
 * 根据id获取某个节点对象
 *
 * @param document
 * @param id
 * @return
 */
public Node findNodeById(Document document, String id) {
  return document.getElementById(id);
} 

5.删除指定的节点对象

/**
   * 删除某个节点对象
   *
   * @param document
   * @param id
   * @throws TransformerException
   */
  public void deleteNodeById(Document document, String id)
      throws TransformerException {
    //获取删除的节点对象
    Node node = document.getElementById(id);
    // 是通过父节点调用removeChild(node)把子节点给删除掉
    Node node1 = node.getParentNode().removeChild(node); 

    //创建TransformerFactory对象
    TransformerFactory transformerFactory = TransformerFactory
        .newInstance();
    //Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出
    //Transformer对象通过TransformerFactory获得
    Transformer transformer = transformerFactory.newTransformer();
    // 把Document对象又重新写入到一个XML文件中。
    transformer.transform(new DOMSource(document), new StreamResult(
        new File("src//a.xml")));
  } 

6.更新某个节点对象

/**
 * 更新某个节点
 *
 * @param document
 * @param id
 * @throws TransformerException
 */
public void updateNodeById(Document document, String id)
    throws TransformerException {
  //根据id获取元素指定的元素节点对象
  Element node = document.getElementById(id);
  //获取元素节点的id属性节点对象
  Attr attr = node.getAttributeNode("id");
  //修改元素节点的属性值
  attr.setValue("x122"); 

  //获取该节点对象的所有孩子节点对象name、age、sex节点
  NodeList nodelist = node.getChildNodes();
    //遍历
  for (int i = 0; i < nodelist.getLength(); i++) {
    //得到具体的节点对象
    Node n = nodelist.item(i);
    //判断是否是元素节点对象
    if (n.getNodeType() == Node.ELEMENT_NODE) {
      //看是否是name节点
      if (n.getNodeName().equals("name")) {
        n.setTextContent("君君");//修改其值
      } else if (n.getNodeName().equals("age")) {//看看是否是age节点
        n.setTextContent("80");//修改其值
      } else if (n.getNodeName().equals("sex")) {//看看是否是sex节点
        n.setTextContent("男");//修改其值
      } else {
        System.out.println("不做处理");
      }
    }
  } 

  //创建TransformerFactory对象
  TransformerFactory transformerFactory = TransformerFactory
      .newInstance();
  //Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出
  //Transformer对象通过TransformerFactory获得
  Transformer transformer = transformerFactory.newTransformer();
  //把Document对象又重新写入到一个XML文件中。
  transformer.transform(new DOMSource(document), new StreamResult(
      new File("src//b.xml")));
} 

7.在某个节点的下方添加新的节点

/**
 * 在指定的节点下方添加新得某个节点
 *
 * @param document
 * @param id
 * @throws TransformerException
 */
public void addNodeById(Document document, String id)
    throws TransformerException {
  //获取要添加位置节点的兄弟节点对象
  Element node = document.getElementById(id);
  //获取其父节点对象
  Node parentNode = node.getParentNode();
  //创建元素节点
  Element nd = document.createElement("student");
  //设置元素节点的属性值
  nd.setAttribute("id", "x123");
  //创建name元素节点
  Node name = document.createElement("name");
  //设置name节点的文本值
  name.appendChild(document.createTextNode("陈红军"));
  //创建age元素节点
  Node age = document.createElement("age");
  //设置age节点的文本值
  age.appendChild(document.createTextNode("20"));
  //创建sex元素节点
  Node sex = document.createElement("sex");
  //设置sex节点的文本值
  sex.appendChild(document.createTextNode("男"));
  //在nd节点中添加3个子节点
  nd.appendChild(name);
  nd.appendChild(age);
  nd.appendChild(sex);
  //在父节点中添加nd节点
  parentNode.appendChild(nd);
  //创建TransformerFactory对象
  TransformerFactory transformerFactory = TransformerFactory
      .newInstance();
  //Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出
  //Transformer对象通过TransformerFactory获得
  Transformer transformer = transformerFactory.newTransformer();
  //把Document对象又重新写入到一个XML文件中。
  transformer.transform(new DOMSource(document), new StreamResult(
      new File("src//c.xml")));
} 

通过以上方法的练习希望你对xml的DOM解析有个入门的了解.

总结

以上所述是小编给大家介绍的使用jaxp进行dom解析_,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • java dom4j解析xml文件代码实例分享

    解析xml文件有两种方式,一种是利用Dom去解析,这种方式写起代码比较麻烦,对于刚入手的程序员来说比较容易出问题:第二种就是使用Dom4j包去解析在要使用Dom4j包的时候,肯定要先引入包 复制代码 代码如下: import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;import java.util.Iterator; import org.dom4j.Docum

  • Java中JDom解析XML_动力节点Java学院整理

    一.前言 JDOM是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初,JDOM作为一个开放源代码项目正式开始研发.JDOM是一种解析XML的Java工具包. DOM适合于当今流行的各种语言,包括Java,JavaScripte,VB,VBScript,Perl,C,C++等.它了为HTML和XML文档提供了一个可应用于不同平台的编程接口.W3C DOM的最新信息可从http://www.w3.org/TR2001/WD-DOM-Lever-3-C

  • Dom4j解析XML_动力节点Java学院整理

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它. 对主流的java XML API进行的性能.功能和易用性的评测,dom4j无论在那个方面都是非常出色的.如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例如hibernate,包括sun公司自己的JAXM也用了Dom4j. 使用

  • java使用xpath和dom4j解析xml

    1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种,一种叫SAX,另一种叫DOM.SAX是基于事件流的解析,DOM是基于XML文档树结构的解析.在此基础上,为了减少DOM.SAX的编码量,出现了JDOM,其优点是,20-80原则(帕累托法则),极大减少了代码量.通常情况下JDOM使用时满足要实现的功能简单,如解析.创建等要求.但在底层,JDOM还是使用SAX(最常用).DOM.Xanan文档.另外一种是DOM4J,是一个非常非常优秀的Java XML API,

  • 在java中使用dom4j解析xml(示例代码)

    虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 xml文档: 复制代码 代码如下: <?xml version="1.0" encoding=&quo

  • 使用jaxp进行dom解析_动力节点Java学院整理

    1.javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回 2.调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂. 3.调用工厂对象的 newDocumentBuilder

  • Java中使用jaxp进行sax解析_动力节点Java学院整理

    SAX解析XML文件采用事件驱动的方式进行,也就是说,SAX是逐行扫描文件,遇到符合条件的设定条件后就会触发特定的事件,回调你写好的事件处理程序.使用SAX的优势在于其解析速度较快,相对于DOM而言占用内存较少.而且SAX在解析文件的过程中得到自己需要的信息后可以随时终止解析,并不一定要等文件全部解析完毕.凡事有利必有弊,其劣势在于SAX采用的是流式处理方式,当遇到某个标签的时候,它并不会记录下以前所遇到的标签,也就是说,在处理某个标签的时候,比如在startElement方法中,所能够得到的信

  • Java异常继承结构解析_动力节点Java学院整理

    Java异常类层次结构图: 异常的英文单词是exception,字面翻译就是"意外.例外"的意思,也就是非正常情况.事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误.比如使用空的引用.数组下标越界.内存溢出错误等,这些都是意外的情况,背离我们程序本身的意图.错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误,在编译期间出现的错误有编译器帮助我们一起修正,然而运行期间的错误便不是编译器力所能及了,并且运行期间的错误往往是难以预料的.假若程序在运行期间出现了错误

  • jQuery修改DOM结构_动力节点Java学院整理

    直接使用浏览器提供的API对DOM结构进行修改,不但代码复杂,而且要针对浏览器写不同的代码. 有了jQuery,我们就专注于操作jQuery对象本身,底层的DOM操作由jQuery完成就可以了,这样一来,修改DOM也大大简化了. 添加DOM 要添加新的DOM节点,除了通过jQuery的html()这种暴力方法外,还可以用append()方法,例如: <div id="test-div"> <ul> <li><span>JavaScript

  • Nginx简介_动力节点Java学院整理

    1.什么是Nginx Nginx来自俄罗斯的Igor Sysoev在为Rambler Media(http://www.rambler.ru/)工作期间,使用C语言开发了Nginx.Nginx作为Web服务器,一直为俄罗斯著名的门户网站Rambler Media提供着出色.稳定的服务. Igor Sysoev将Nginx的代码开源,并且赋予其最自由的2-clause BSD-like license许可证.由于Nginx使用基于事件驱动的架构能够并发处理百万级别的TCP连接,高度模块化的设计和自

  • 十大常见Java String问题_动力节点Java学院整理

    本文介绍Java中关于String最常见的10个问题: 1. 字符串比较,使用 "==" 还是 equals() ? 简单来说, "==" 判断两个引用的是不是同一个内存地址(同一个物理对象). 而 equals 判断两个字符串的值是否相等. 除非你想判断两个string引用是否同一个对象,否则应该总是使用 equals()方法. 如果你了解 字符串的驻留 ( String Interning ) 则会更好地理解这个问题 2. 对于敏感信息,为何使用char[]要比

  • Java JVM原理与调优_动力节点Java学院整理

    JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域. JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行.是运行Java应用最底层部分. JDK(Java Development kit) 整个Java的核心,包括了Java运行环境(Java Runtime E

  • Java中的HashSet详解和使用示例_动力节点Java学院整理

    第1部分 HashSet介绍 HashSet 简介 HashSet 是一个没有重复元素的集合. 它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素. HashSet是非同步的.如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步.这通常是通过对自然封装该 set 的对象执行同步操作来完成的.如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来"包装" set.

  • Java 中的HashMap详解和使用示例_动力节点Java学院整理

    第1部分 HashMap介绍 HashMap简介 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.Serializable接口. HashMap 的实现不是同步的,这意味着它不是线程安全的.它的key.value都可以为null.此外,HashMap中的映射不是有序的. HashMap 的实例有两个参数影响其性能:"初始容量" 和 "加载因子&quo

  • Java枚举_动力节点Java学院整理

    enum 的全称为 enumeration, 是 JDK 5  中引入的新特性,存放在 java.lang 包中. 原始的接口定义常量 public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu"; String FRI = "Fri"; String

随机推荐