package day06_parser.dom;
/**
* xml的解析技术:JAXP是Java API for XML Processing的英文字头缩写,
* 中文含义是:用于XML文档处理的使用Java语言编写的编程接口。JAXP支持DOM、SAX、XSLT等标准。
* 以下我们研究两种解析方式:
* 1.dom解析 2.sax解析:Simple API for XML
* 以下是dom解析的实例。 * JAXP-DOM解析实例:
* 以下的实例实现的功能是,通过javax.xml包实现dom方式的xml的解析
* 详细的操作有添加节点,删除节点,改动节点内容,查询节点信息
*/ import java.io.File;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.StreamResult;
import org.junit.Test;
import org.w3c.dom.*; public class DOMCURD { //可以用junit測试工具的方法进行測试
public static void main(String[] args) throws Exception{
demo05();
}
//获取和解析器关联的Document对象
@Test
public static void demo01() throws Exception{
//==============获得document==========================
//1.获得工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//2.获得解析器
DocumentBuilder builder=factory.newDocumentBuilder();
//3.依据解析器获取Document对象
@SuppressWarnings("unused")
Document document=builder.parse(new File("db.xml"));
}
//查询
public static void demo02() throws Exception{
//1.获得document
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse(new File("db.xml"));
//2.获得根元素--books(可以省略)
@SuppressWarnings("unused")
Element rootElement=document.getDocumentElement(); //3.获取全部的book元素。属性id
NodeList allBookElements=document.getElementsByTagName("book");
//4遍历book元素----本实例db.xml中有两个book元素
for(int i=0;i<allBookElements.getLength();i++){
Element childNode=(Element)allBookElements.item(i);
System.out.println(i);
//4.1获取book元素的id属性
String id=childNode.getAttribute("id");
System.out.println("###id:"+id);
System.out.println(childNode.getNodeName());
//4.2获取book元素下的子节点
NodeList childNodeList=childNode.getChildNodes();
//注意文本也是节点,所以回车换行的部分会是文本,也会加入到上面定义的childNodeList中
//遍历
for(int j=0;j<childNodeList.getLength();j++)
{
//做推断-是否是非文本节点
Node childNode2=childNodeList.item(j);
//有两种方式推断是否一定是元素
//================方法1=========================
if(childNode2.getNodeType()==Node.ELEMENT_NODE)
{
//获取标签的名称
System.out.print(childNode2.getNodeName());
System.out.println(":");
//获取元素标签的内容
System.out.println(childNode2.getTextContent());
}
//===============方法2==========================
if(childNode2 instanceof Element)
{//...........}
//=============================================
}
} }
}
//添加
public static void demo03() throws Exception{
//获取doument对象-dom方式
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse(new File("db.xml"));
//获取根元素
Element rootElement=document.getDocumentElement();
//创建新元素,不要以为是rootElement创建的哦,Document创建。用appendchild()关联
Element bookElement=document.createElement("book");
//为元素创建id属性
bookElement.setAttribute("id", "b0003");
//为book元素创建子元素
Element newTitleElement=document.createElement("title");
newTitleElement.setTextContent("Flex开发");
Element newPriceElement=document.createElement("price");
newPriceElement.setTextContent("98");
Element newAuthorElement=document.createElement("author");
newAuthorElement.setTextContent("胡玉勉");
bookElement.appendChild(newTitleElement);
bookElement.appendChild(newPriceElement);
bookElement.appendChild(newAuthorElement);
//将book加入到根节点rootElement下
rootElement.appendChild(bookElement);
//=======将创建好了新元素的document更新到原来的文件里=====
//运用javax.transform技术
TransformerFactory tformFactory=TransformerFactory.newInstance();
//transform(Source xmlSource, Result outputTarget)
//将 XML Source 转换为 Result。
Transformer transformer=tformFactory.newTransformer();
//这里面的參数不用rootElement,用document
Source xmlSource=new DOMSource(document);
Result outputTarget=new StreamResult(new File("db.xml"));
transformer.transform(xmlSource, outputTarget);
}
//删除-通过父节点删除子节点
@SuppressWarnings("unused")
public static void demo04() throws Exception{
//获取document
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse(new File("db.xml"));
//获取根元素
Element rootElement=document.getDocumentElement();
//删除某一个book元素,比方id为“b003”
//1.获取id为“b003”的元素
NodeList allBookElement = document.getElementsByTagName("book");
for(int m = 0 ; m < allBookElement.getLength() ; m ++){
Element bookElement = (Element) allBookElement.item(m);
String id = bookElement.getAttribute("id");
if("b0003".equals(id)){
//注意删除节点的时候,应遵循由自己找到父节点。然后通过父节点删除
bookElement.getParentNode().removeChild(bookElement);
}
}
//=======将删除了的document更新到原来的文件里=====
//运用javax.transform技术:Transformer此抽象类的实例可以将源树转换为结果树
TransformerFactory tformFactory=TransformerFactory.newInstance();
//transform(Source xmlSource, Result outputTarget)
//将 XML Source 转换为 Result。
Transformer transformer=tformFactory.newTransformer();
//这里面的參数不用rootElement。用document
Source xmlSource=new DOMSource(document);
Result outputTarget=new StreamResult(new File("db.xml"));
transformer.transform(xmlSource, outputTarget);
}
//改动
@SuppressWarnings("unused")
public static void demo05() throws Exception{
//获取document
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document document=builder.parse(new File("db.xml"));
Element rootElement=document.getDocumentElement();
//获取元素进行改动
NodeList bookNodeList=document.getElementsByTagName("book");
//遍历,对id=“b002”的book元素进行改动
for(int i=0;i<bookNodeList.getLength();i++){
Element bookNode=(Element)bookNodeList.item(i);
String id=bookNode.getAttribute("id");
if("b002".equals(id)){
//获取元素的子节点进行改动
NodeList childNodeList=bookNode.getChildNodes();
for(int j=0;j<childNodeList.getLength();j++){
Node bookChildNode=childNodeList.item(j);
System.out.println(bookChildNode.getNodeName());
bookChildNode.setTextContent("改动了节点的文本内容");
System.out.println(bookChildNode.getTextContent());
}
}
}
//记住别忘了回写到xml文件里
//=======将删除了的document更新到原来的文件里=====
//运用javax.transform技术:Transformer此抽象类的实例可以将源树转换为结果树
TransformerFactory tformFactory=TransformerFactory.newInstance();
//transform(Source xmlSource, Result outputTarget)
//将 XML Source 转换为 Result。
Transformer transformer=tformFactory.newTransformer();
//这里面的參数不用rootElement,用document
Source xmlSource=new DOMSource(document);
Result outputTarget=new StreamResult(new File("db.xml"));
transformer.transform(xmlSource, outputTarget);
}
}

xml解析-jaxp之dom解析的更多相关文章

  1. 2.1 使用JAXP 对 xml文档进行DOM解析

    //使用 jaxp 对xml文档进行dom解析 public class Demo2 { //必要步骤 @Test public void test() throws Exception { //1. ...

  2. 使用JAXP对xml文档进行DOM解析基础

    XML解析方式分为两种:dom和sax         dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式.       sax: ...

  3. XML案例(使用JAXP进行DOM解析)

    1.book.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> ...

  4. 解析XML文件之使用DOM解析器

    在前面的文章中.介绍了使用SAX解析器对XML文件进行解析.SAX解析器的长处就是占用内存小.这篇文章主要介绍使用DOM解析器对XML文件进行解析. DOM解析器的长处可能是理解起来比較的直观,当然, ...

  5. Android笔记(四十五) Android中的数据存储——XML(一)DOM解析器

    DOM解析XML在j2ee开发中比较常见,在Dom解析的过程中,是先把dom全部文件读入到内存中,然后使用dom的api遍历所有数据,检索想要的数据,这种方式显然是一种比较消耗内存的方式,对于像手机这 ...

  6. 使用JAXP对XML文档进行DOM解析

    import java.io.FileOutputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers. ...

  7. javaweb学习总结十一(JAXP对XML文档进行DOM解析)

    一:将内存中写好的xml文件读取到硬盘上 二:DOM方式对xml文件进行增删改查 1:添加节点(默认是在最后的子节点后面添加) @Test // 向元素中添加节点<version>1.0& ...

  8. Javaweb学习笔记——(六)——————xml中jaxp两种解析方式和dom4j运用

    1.xml的scheam约束 dtd的语法:<!ElEMENT 元素名称 约束> **schema符合xml的语法,xml语句 **一个xml中可以有多个schema,多个schema使用 ...

  9. XML解析-Dom4j的DOM解析方式更新XML

    Dom4j工具,是非官方的,不在jdk中. 使用步骤: 1)导入dom4j的核心包. dom4j-1.6.1.jar 2)编写Dom4j读取xml文件的代码 1.更新XML 1.1.写出内容到xml文 ...

随机推荐

  1. python3.6 子类的__init__调用父类的__init__

    python3.6 子类的__init__调用父类的__init__ 父类 class worker: def __init__(self): self.a=1 self.b=2 if __name_ ...

  2. Vue如何封装多个全局过滤器到一个文件

    #### 在写vue项目时,所用的过滤器很多时,把所有的过滤器方法封装在一个文件中,然后导出,并绑定在vue实例上 1.在src下创建filters文件夹,并新建index.js文件 2. index ...

  3. API 接口设计工具 --Swagger

      swagger-editor,无法启动GUI软件,在线版的FQ也打不开   null

  4. js动态实现时分秒

    <div id="time" style="color: #96C2DD;</div>      <script type="text/ ...

  5. Oracle命令整理

    1 常用命令 常用命令 1 sqlplus  scott/tiger@192.168.47.10:1521/orcl      后面不要加: sqlplus  sys/oracle  as sysdb ...

  6. 通过宏定义将__declspec(dllexport)与__declspec(dllimport)的转化,实现库代码和使用代码使用同一份头文件

    我们知道,在VC编程中,如果要编译成动态链接库,需要将函数.变量.类等导出,这时使用__declspec(dllexport).使用动态链接库时,需要在声明的时候有使用__declspec(dllim ...

  7. Design Pattern理解碎片

    开发封闭原则(Open-Closed Principle OCP)Software entities(classes,modules,functions etc) should open for ex ...

  8. javascript window.open in safari

    在ios系统中,无法使用 window.open 打开url,经过一番尝试终于找到了解决办法 var url='http://www.baodu.com'; var deviceAgent = nav ...

  9. C# ADO.NET

    ADO.NET 作业总结难点 数据库语句掌握太差 //查询 select * from Users //查询表中所有数据 select * from Users where UserName = 'l ...

  10. 关于C#的Lock锁思考

    大家都知道多线程并发时候存在一个线程同步的问题,一般使用lock关键字来处理. lock关键字的结果如下: object locker=new object(); lock(locker) { ... ...