DTD约束
Book.dtd:
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,价格,介绍)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 价格 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)> 为书名设置属性 name(必须)
<!ATTLIST 书名 name CDATA #REQUIRED> Book.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架
SYSTEM "book.dtd">
<书架>
<书>
<书名 name="wy">计算机科学与技术</书名>
<价格>36.0</价格>
<介绍>这本书很好</介绍>
</书>
<书>
<书名 name="ztt">科学管理课</书名>
<价格>30.0</价格>
<介绍>这本书挺好</介绍>
</书>
<书>
<书名 name="wu">李清照集注</书名>
<价格>60.0</价格>
<介绍>这本书非常好</介绍>
</书>
</书架>
Jaxp对xml进行DOM解析---读取
(1)获取XML中的书名 public void read() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); NodeList list = document.getElementsByTagName("书名");
Node node = list.item(1);
String content = node.getTextContent();
System.out.println(content); } (2)获取所有的节点
public void read2() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); Node root = document.getElementsByTagName("书架").item(0);
list(root); } private void list(Node root) {
if(root instanceof Element)
System.out.println(root.getNodeName());
NodeList list=root.getChildNodes();
for(int i=0;i<list.getLength();i++)
{
Node child=list.item(i);
list(child);
} }
(3)获取文档中的属性
public void read3() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); Element bookname =(Element) document.getElementsByTagName("书名").item(0);
String value=bookname.getAttribute("name");
System.out.println(value);
}
XML解析---增加
(1)默认在末尾添加节点
@Test
public void add() throws Exception
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml");
//创建节点
Element ele=document.createElement("价格");
ele.setTextContent("10元");
//创建节点挂在第一个节点上
Element book=(Element)document.getElementsByTagName("书").item(0);
book.appendChild(ele);
//把更新后内存写回到xml文档
TransformerFactory tffactory=TransformerFactory.newInstance();
Transformer tf=tffactory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } (2) 在文档指定位置添加节点
@Test
public void add2() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml");
// 创建节点
Element ele = document.createElement("价格");
ele.setTextContent("10元"); // 得到参考节点
Element refNode = (Element) document.getElementsByTagName("价格").item(0); // 得到要挂的节点
Element book = (Element) document.getElementsByTagName("书").item(0); // 往book节点的指定位置插孩子节点
book.insertBefore(ele, refNode);
// 把更新后内存写回到xml文档
TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer tf = tffactory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(
new FileOutputStream("src/book.xml"))); }
(3) 在文档中为标签添加属性
@Test
public void addAttr() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml");
Element bookname = (Element) document.getElementsByTagName("书名")
.item(0);
bookname.setAttribute("name", "wy");
TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer tf = tffactory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(
new FileOutputStream("src/book.xml"))); }
删除
1.删除1
@Test
public void delete1() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); // 得到要删除的节点
Element ele = (Element) document.getElementsByTagName("价格").item(0); // 得到要删除的节点的父节点
Element book = (Element) document.getElementsByTagName("书").item(0); // 父节点删除子节点
book.removeChild(ele); TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer tf = tffactory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(
new FileOutputStream("src/book.xml")));
}
(2)删除2
@Test
public void delete2() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); // 得到要删除的节点
Element ele = (Element) document.getElementsByTagName("价格").item(0);
ele.getParentNode().getParentNode().removeChild(ele.getParentNode()); TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer tf = tffactory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(
new FileOutputStream("src/book.xml")));
}
5更新
@Test
public void update() throws Exception
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); Element ele=(Element)document.getElementsByTagName("价格").item(0);
ele.setTextContent("100元"); //把更新后的内存写到xml文档中去
TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer tf = tffactory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
}
SAX解析XML
1.步骤:
  //创建工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
//得到解析器
SAXParser sp=factory.newSAXParser();
//得到读取器
XMLReader reader=sp.getXMLReader();
//设置内容处理器
reader.setContentHandler(new ListHandler());
//读取xml文档内容
reader.parse("src/book.xml");

XML学习经验实例总结2的更多相关文章

  1. delphi操作xml学习笔记 之一 入门必读

    Delphi 对XML的支持---TXMLDocument类       Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...

  2. 我个人的Java学习经验(一家之言)

    声明:本文只是我的个人经验之谈,或者连经验之谈都算不上,因为我觉得自己还是个新手,没有什么经验可谈,就算是我分享一下自己从开始学习Java到现在的一些心路历程吧,各位看官暂且看吧,欢迎交流.第一部分算 ...

  3. XML学习教程

    XML学习进阶1-- 什么是XML. 为什么使用 XML?... 什么是 XML?... 数据的结构表示... XML 文档... 数据是从表示和处理中分离出来的... 使XML数据自描述... XM ...

  4. Robot framework--内置库xml学习(一)

    Using lxml By default this library uses Python's standard ElementTree module for parsing XML, but it ...

  5. 从技术小白到收获BAT研发offer,分享我的学习经验和感悟(赠送相关学习资料)

    去年秋季参加了校园招聘,有幸拿到了BAT.头条.网易.滴滴.亚马逊.华为等offer,经过研究生两年的学习积累,终于达成了自己的目标,期间也经历了很多,谨以此文,聊表感叹,也会分享很多我的Java学习 ...

  6. 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值

    前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...

  7. SQL语句学习手册实例版

    SQL语句学习手册实例版 表操作 例1  对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE  TABLE  STUDENTS (SNO      NUMERIC (6, ...

  8. [转]C语言指针学习经验总结浅谈

    指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...

  9. XML 学习介绍 收藏

    XML学习总结(一)——XML介绍 一.XML概念 Extensible Markup Language,翻译过来为可扩展标记语言.Xml技术是w3c组织发布的,目前推荐遵循的是W3C组织于2000发 ...

随机推荐

  1. MVC 扩展 Html.ImageFor

    Asp.Net MVC 扩展 Html.ImageFor 方法详解 背景: 在Asp.net MVC中定义模型的时候,DataType有DataType.ImageUrl这个类型,但htmlhelpe ...

  2. paip.输入法编程---输入法ATIaN历史记录 c823

    paip.输入法编程---输入法ATIaN历史记录 c823 作者Attilax ,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csd ...

  3. CImage类的介绍与使用

    CImage类的介绍与使用 程序代码下载处:http://download.csdn.net/source/2098910 下载处:http://hi.baidu.com/wangleitongxin ...

  4. 为学Linux,我看了这些书

    为学Linux,我看了这些书   去年开始,抱着学习的态度开始了我的Linux学习,到现在,差不多一年了,收获很多,不敢说精通Linux,但是,还是对得起"略懂"这两个字的.这一年 ...

  5. 12 - 多线程、执行队列、GCD

    一.多线程 进程:一个应用程序配套一个进程,进程会加载应用程序的资源,进程是放代码的,一个进程默认是一个线程(主线程),可以有多个线程 线程:执行代码的是线程,一个线程同时只能读取一段代码 栈里的变量 ...

  6. QTableWidget排序问题

    今天写代码,发现Qt4中QTableWidget显示查询结果数据时存在一个问题,具体原因不知道是用法不对还是QTableWidget本身存在的bug.现象如下: 1.      查询,能正常显示查询结 ...

  7. Android中连接蓝牙设备时遇到createRfcommSocketToServiceRecord的UUID问题和BluetoothSocket的connect失败

    [问题] 折腾: [记录]编写Android中的蓝牙模块驱动和底层HART设备 期间,参考: Bluetooth | Android Developers – ManagingAConnection ...

  8. Oracle闪回flashback总结

    1.说明: Ø  采用的技术. 使用的是多个技术. 1.      闪回日志 2.      回收站 3.      回滚段 无法使用回收站的操作 Drop table xxx purge; Drop ...

  9. skip32

    在某些应用场景下,需要对数字进行加密,skip32无疑是一种很实用的算法,网上有python的源码(https://bitbucket.org/anuraguniyal/skip32.py/src/4 ...

  10. 《C陷阱与缺陷》整理二

    1.数组名作实參     在C语言中,我们没有办法将一个数组作为函数參数传递,假设我们使用数组名作为參数.这个时候数组名立马会被转换为指向该数组的第一个元素的指针.     关于这一点的理解能够向前深 ...