首页 > 编程语言 >JavaWeb基础day01_XML

JavaWeb基础day01_XML

时间:2022-09-30 11:05:29浏览次数:95  
标签:XML 解析 JavaWeb day01 DTD separator File element


一、XML

XML文件的默认打开方式是浏览器

xml:是可扩展的标记语言 Extensible Markup Language。以一种标签语言与HTML类似

1、xml的作用

  1. 编写配置文件:C3P0编写XML配置文件
  2. 做数据传输

2、有效的XML文档

  1. 必须是格式良好的XML文档
  2. 使用DTD和XSD(XML Schema)定义语义约束

2.1、格式良好的XML

  • 声明信息,用于描述XML的版本和编码方式
<?xml version="1.0" encoding="UTF-8"?>
  • XML要有且仅有一个根元素。一个元素是一对标签,标签里面是内容
<books><!-- 根标签 -->
<books_name 属性=“属性值”><!-- 子元素 -->
<!-- 这里是写注释 -->
</books_name>
</books>
  • XML是大小写敏感的
  • XML是标签成对的,而且要正确嵌套
  • 属性值要使用双引号。
  • 注释的写法
<!-- 这里写注释 -->

【案例1】:描述一下学生的信息

<?xml version="1.0" encoding="UTF-8"?>
<Students>
<student id="1">
<name>王彤</name>
<course>Java</course>
<score>89</score>
</student>
<student id="2">
<name>李佳</name>
<course>sql</course>
<score>58</score>
</student>
</Students>

二、DTD

1、DTD简介

DTD:文档类型定义 Document Type Definition

2、DTD作用

  • 约束XML文档格式,保证XML是一个有效的XML文档

3、DTD用法

DTD在使用的时候可以分为两种

  1. 内部DTD
  2. 外部DTD

3.1 内部DTD

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE 根元素 [元素声明]>
【元素声明语法】
<!ELEMENT 元素名(子元素[,子元素……])>

【数量词】 限制元素出现的次数

数量词

含义

+

表示出现​​一次或者多次​


​出现零次或一次​

*

出现零次或多次,​​即任意次​

【属性声明语法】

属性声明使用下列语法:

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

【属性类型】:CDATA,表示字符数据(character data)

【默认值】

  • #REQUIRED:必须出现
  • #IMPLIED:不是必须的
<!ATTLIST student id CDATA "0">
<!ATTLIST student id CDATA #REQUIRED>
<!ATTLIST student id CDATA #IMPLIED>

【格式良好的DTD约束的XML文档】

【案例1】:描述一下学生的信息使用DTD约束

<?xml version="1.0" encoding="UTF-8"?>
<!-- 声明内部DTD --> <!-- 中括号内写元素声明 -->
<!DOCTYPE scores [<!ELEMENT scores (student*) >
<!ELEMENT student (name, course, score)>
<!ATTLIST student id CDATA #REQUIRED>

<!ELEMENT name (#PCDATA)> <!-- 表示只允许标签里写内容 -->
<!ELEMENT course (#PCDATA)> <!-- 表示只允许标签里写内容 -->
<!ELEMENT score (#PCDATA)> <!-- 表示只允许标签里写内容 -->]>
<scores>
<student id="1">
<name>王彤</name>
<course>Java</course>
<score>89</score>
</student>
<student id="2">
<name>李佳</name>
<course>sql</course>
<score>58</score>
</student>
<student id="3">
<name>张三</name>
<course>html</course>
<score>88</score>
</student>
</scores>

3.2 外部DTD

创建一个独立的DTD文件

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT scores (student*) >
<!ELEMENT student (name, course, score)>
<!ATTLIST student id CDATA #REQUIRED>

<!ELEMENT name (#PCDATA)> <!-- 表示只允许标签里写内容 -->
<!ELEMENT course (#PCDATA)> <!-- 表示只允许标签里写内容 -->
<!ELEMENT score (#PCDATA)> <!-- 表示只允许标签里写内容 -->

在XML文件中引入DTD文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入外部DTD -->
<!DOCTYPE scores SYSTEM "Student.dtd">
<scores>
<student id="1">
<name>王彤</name>
<course>Java</course>
<score>89</score>
</student>
<student id="2">
<name>李佳</name>
<course>sql</course>
<score>58</score>
</student>
</scores>

三、约束和验证XML

1、XSD

  • XSD
  • XML Schema是DTD的替代者
  • 不仅可以定义XML文档的结构, 还可以规范文档的内容
  • XSD本身也是XML文档,
  • XSD采用XML文档来定义语义约束,比DTD要复杂一-些,但是功能强大的多。
  • 支持丰富的数据类型
  • 允许开发者自定义数据类型
  • 可读性强
  • 可针对未来需求进行扩展

2、XML解析技术

对XML文件的操作,包括创建XML,对XML文件的增删改查操作

2.1常见的XML解析技术有哪些?

2.1.1 DOM解析

基于XML树结构,耗费资源。是官方提供的解析方式

2.1.2 SAX解析

是民间的解析方式,SAX是基于事件的解析方式,消耗的资源少。数据量大的时候适用

以上两种都是原生的解析方式,代码量巨大

2.1.3 JDOM解析

第三方提供的解析,开源,免费的解析方式,效率比DOM解析快

2.1.4 DOM4J接口**

第三方提供的解析,开源,免费的解析方式,是JDOM的升级版

2.2 使用DOM4J解析XML

解析XML入口是一个对象,是需要先拿到一个Document对象

2.2.1读取XML文档中的信息

  1. 导包:dom4j.jar
  2. 编写代码测试【如下】
public class Test {
public static void main(String[] args) {
//[1]创建SAX对象,用于读取XML文件
SAXReader reader = new SAXReader();
Document doc = null;
try {
// [2]读取xml文件,找到Document对象
doc = reader.read(new File("src"+File.separator+"com"+File.separator+"wei"+File.separator+"xml"+File.separator+"Student2.xml"));
//[3]获取根元素 getRootElement
Element root = doc.getRootElement();
//System.out.println("根元素:"+root.getName());

//[4 iterator]迭代器迭代更元素下的所有元素
Iterator<Element> it = root.elementIterator();
while (it.hasNext()) {
Element element = (Element) it.next();
//System.out.println(element.getName());

//[5]取属性 Iterator attributes = element.attributeIterator(); 多个属性迭代继续
Attribute id = element.attribute("id");
//System.out.println(id.getName()+"="+id.getValue());

//[6]获取子元素
/*Iterator<Element> elements = element.elementIterator();
while (elements.hasNext()) {
Element element2 = (Element) elements.next();
System.out.println(element2.getName());
}*/
//[7]打印输出
System.out.println("id="+element.attribute("id").getName()+"-----"+"value="+element.attribute("id").getText());
System.out.println("name="+element.element("name").getName()+"-----"+"value="+element.element("name").getText());
System.out.println("score="+element.element("score").getName()+"-----"+"value="+element.element("score").getText());
System.out.println("course="+element.element("course").getName()+"-----"+"value="+element.element("course").getText());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

2.2.2 使用dom4j生成XML文件

public class Test2 {
public static void main(String[] args) {
// [1] 通过Documenthelper创建一个documnet对象
Document doc = DocumentHelper.createDocument();
// [2] 写一个Xml文件,添加一个根元素,并得到根元素
Element root = doc.addElement("books");
// [3] 为根元素添加元素
Element book = root.addElement("book");
// [4] 为元素添加属性 方便链式编程
book.addAttribute("id", "b01");
// [5] 为book添加在元素
Element name = book.addElement("name");
Element author = book.addElement("author");
Element price = book.addElement("price");
// [6] 为子元素添加文本信息
name.addText("Thinking in java");
author.addText("efcod");
price.addText("88");

// [7] 将doc输出到XML文件中即可
Writer writer = null;
Writer writerFormat = null;
try {
writer = new FileWriter(new File("src"+File.separator+"com"+File.separator+"wei"+File.separator+"dom4j"+File.separator+"book2.xml"));
writerFormat = new FileWriter(new File("src"+File.separator+"com"+File.separator+"wei"+File.separator+"dom4j"+File.separator+"bookFormat.xml"));
doc.write(writer);
// [8] 格式良好的输出
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer2 = new XMLWriter(writerFormat,format);
writer2.write(doc);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if (writer!=null) {
writer.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (writerFormat!=null) {
writerFormat.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}


标签:XML,解析,JavaWeb,day01,DTD,separator,File,element
From: https://blog.51cto.com/u_14957231/5725624

相关文章

  • Taurus.MVC-Java 版本打包上传到Maven中央仓库(详细过程):4、Maven项目转换与pom.xml配置
    文章目录:​​Taurus.MVC-Java版本打包上传到Maven中央仓库(详细过程):1、JIRA账号注册​​​​Taurus.MVC-Java版本打包上传到Maven中央仓库(详细过程):2、PGP下载安装与密钥生......
  • Xml让人郁闷的SelectNodes方法
    SelectNodes(xpath,namespace)方法中无论是xmlDoc.SelectNodes(xpath,namespace)//假设xmlDoc为根节点,整个文档下的查询还是xmlDoc.ChildNodes[i].SelectNodes(xpath,name......
  • 读取xml文件帮助类
    1.XML帮助类publicclassXmlHelper{publicstaticstringGetElementByName(stringxmlFileName,stringtagName){try......
  • javaweb核心之页面技术
    2页面技术2.1JSP基础2.1.1JSP简介JSP全称是JavaServerPage,它和Servlet一样,也是sun公司推出的一套开发动态web资源的技术,称为JSP/Servlet规范。JSP的本质其实就是一......
  • 关于UE4 C++项目编译rapidxml库并运行时报错问题
    新建了一个UE4的C++项目,想使用第三方的rapidxml库对我以前作cocos2d-x的游戏配置数据进行解析,因为以前就用的是这个库。发现在UEEditer里编译C++的时候不会出错,但在xc......
  • Java_day01
    Java的特性和优势-简单性-面向对象-可移植性-高性能-分布式-动态性-多线程-安全性-健壮性Java成功的原因个人认为在于语言本身的优势之外还有个人电脑的普及......
  • JavaWeb 6 JDBC 常用API
         ......
  • day01-MarkDown
    MarkDown标题标题:#+空格+标题名字字体加粗:一边+两个*hello,world斜体:一边+一个*hello,world加粗斜体:一边三个*hello,world删除线:一边两个~~引用引用:>代码改变世......
  • 13.javaweb三大组件
    ......
  • 6.Xml
          ......