JAVASE之XML
2013-10-13 13:16
363 查看
XML
简介:利用xml跨平台的特性,用来在不同的操作系统不同的开发语言之间传输数据;利用xml可以保存具有关系的数据的特性,还常常被用来做为配置文件使用.xml利用标签来保存数据的内容,利用标签之间的嵌套关系来保存数据之间的关系
XML语法
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
属性介绍
version:遵循的XML规范的版本号
encoding:申明当前文件的编码格式 保存的时候一定要这个格式,否则会出现乱码异常
standalone:当前文件是否需要依赖别的文件 值为yes或no
命名规范:
区分大小写,例如,<P>和<p>是两个不同的标记。
不能以数字或标点符号或"_"开头。
不能以xml(或XML、或Xml 等)开头。
不能包含空格。
名称中间不能包含冒号(:)
注释
<!-- 这里面写注释的内容-->
转义CDATA区 :用户来转一大块代码块
<![CATA[内容区]]/>
转义字符
& --> &
< --> <
> --> >
" --> "
' --> '
DTD
简介:DTD是一门xml约束技术,用来约束xml写法
定义元素约束:
语法:<!ELEMENT 元素名称 元素约束> 元素约束可以是元素内容、或存放类型
元素约束
•如为存放类型,则直接书写,DTD规范定义了如下几种类型:
•EMPTY:用于定义空元素,例如<br/> <hr/>
•ANY:表示元素内容为任意类型。
在元素内容中也可以使用+、*、?等符号表示元素出现的次数:
+: 一次或多次 (书+)
?: 0次或一次(书?)
*: 0次或多次 (书*)
示例:
<!Element 书 (名称,价格,作者) >
<!Element 书 (名称|价格|作者) >
<!Element 书 (#PCDATA)>
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
定义属性约束
语法:<!ATTLIST 元素名 属性名1 属性类型 属性约束 属性名2 属性类型 属性约束 …… >
属性类型
CDATA:表示属性值为普通文本字符串。
ENUMERATED 表示属性值为为Enum类型的
ID 表示属性值值为不可重复的,必须是单一值的类型
ENTITY(实体) 表示是实体类型的
---引用实体
<!ENTITY 实体名称 “实体内容” >:直接转变成实体内容
---参数实体
<!ENTITY % 实体名称 "实体内容" >
属性约束
•#REQUIRED:必须设置该属性
•#IMPLIED:可以设置也可以不设置
•#FIXED:说明该属性的取值固定为一个值,在 XML 文件中不能为该属性设置其它值。使用该元素时无需为其分配该属性,XML处理器会自动为给属性增加固定值
•直接使用默认值:在 XML 中可以设置该值也可以不设置该属性值。若没设置则使用默认值。
示例:
<!ATTLIST 商品 类别 CDATA #REQUIRED 颜色 CDATA #IMPLIED >
<!ATTLIST 页面作者 姓名 CDATA #IMPLIED 年龄 CDATA #IMPLIED 联系信息 CDATA #REQUIRED 网站职务 CDATA #FIXED "页面作者" 个人爱好 CDATA "上网" >
<!ENTITY 书名 "JAVA开发宝典">
<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
<!ELEMENT 个人信息 (%TAG_NAMES; | 生日)>
<!ELEMENT 客户信息 (%TAG_NAMES; | 公司名)>
<!ENTITY % common.attributes " id ID #IMPLIED account CDATA #REQUIRED " >
<!ATTLIST purchaseOrder %common.attributes;>
<!ATTLIST item %common.attributes;>
Schema
在XML中引用DTD
(1)外部引入
~引入本地硬盘上的DTD文件:<!DOCTYPE 根元素名 SYSTEM "文件位置">
~引入公共位置上的DTD文件: <!DOCTYPE 根元素名称 PUBLIC "文件名称" "文件位置">
(2)内部引入
直接将DTD约束写在XML内部,这种方式叫做内部引入
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
XML解析
JAXP SAX解析
首先创建一个监听类,响应各种事件
创建解析工厂、解析器、绑定监听类
DOM解析
取得根节点
使用递归读取文件中的所有内容 (内容 节点名 属性)
为XML增加属性
删除元素
简介:利用xml跨平台的特性,用来在不同的操作系统不同的开发语言之间传输数据;利用xml可以保存具有关系的数据的特性,还常常被用来做为配置文件使用.xml利用标签来保存数据的内容,利用标签之间的嵌套关系来保存数据之间的关系
XML语法
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
属性介绍
version:遵循的XML规范的版本号
encoding:申明当前文件的编码格式 保存的时候一定要这个格式,否则会出现乱码异常
standalone:当前文件是否需要依赖别的文件 值为yes或no
命名规范:
区分大小写,例如,<P>和<p>是两个不同的标记。
不能以数字或标点符号或"_"开头。
不能以xml(或XML、或Xml 等)开头。
不能包含空格。
名称中间不能包含冒号(:)
注释
<!-- 这里面写注释的内容-->
转义CDATA区 :用户来转一大块代码块
<![CATA[内容区]]/>
转义字符
& --> &
< --> <
> --> >
" --> "
' --> '
DTD
简介:DTD是一门xml约束技术,用来约束xml写法
定义元素约束:
语法:<!ELEMENT 元素名称 元素约束> 元素约束可以是元素内容、或存放类型
元素约束
•如为存放类型,则直接书写,DTD规范定义了如下几种类型:
•EMPTY:用于定义空元素,例如<br/> <hr/>
•ANY:表示元素内容为任意类型。
在元素内容中也可以使用+、*、?等符号表示元素出现的次数:
+: 一次或多次 (书+)
?: 0次或一次(书?)
*: 0次或多次 (书*)
示例:
<!Element 书 (名称,价格,作者) >
<!Element 书 (名称|价格|作者) >
<!Element 书 (#PCDATA)>
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
定义属性约束
语法:<!ATTLIST 元素名 属性名1 属性类型 属性约束 属性名2 属性类型 属性约束 …… >
属性类型
CDATA:表示属性值为普通文本字符串。
ENUMERATED 表示属性值为为Enum类型的
ID 表示属性值值为不可重复的,必须是单一值的类型
ENTITY(实体) 表示是实体类型的
---引用实体
<!ENTITY 实体名称 “实体内容” >:直接转变成实体内容
---参数实体
<!ENTITY % 实体名称 "实体内容" >
属性约束
•#REQUIRED:必须设置该属性
•#IMPLIED:可以设置也可以不设置
•#FIXED:说明该属性的取值固定为一个值,在 XML 文件中不能为该属性设置其它值。使用该元素时无需为其分配该属性,XML处理器会自动为给属性增加固定值
•直接使用默认值:在 XML 中可以设置该值也可以不设置该属性值。若没设置则使用默认值。
示例:
<!ATTLIST 商品 类别 CDATA #REQUIRED 颜色 CDATA #IMPLIED >
<!ATTLIST 页面作者 姓名 CDATA #IMPLIED 年龄 CDATA #IMPLIED 联系信息 CDATA #REQUIRED 网站职务 CDATA #FIXED "页面作者" 个人爱好 CDATA "上网" >
<!ENTITY 书名 "JAVA开发宝典">
<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
<!ELEMENT 个人信息 (%TAG_NAMES; | 生日)>
<!ELEMENT 客户信息 (%TAG_NAMES; | 公司名)>
<!ENTITY % common.attributes " id ID #IMPLIED account CDATA #REQUIRED " >
<!ATTLIST purchaseOrder %common.attributes;>
<!ATTLIST item %common.attributes;>
Schema
在XML中引用DTD
(1)外部引入
~引入本地硬盘上的DTD文件:<!DOCTYPE 根元素名 SYSTEM "文件位置">
~引入公共位置上的DTD文件: <!DOCTYPE 根元素名称 PUBLIC "文件名称" "文件位置">
(2)内部引入
直接将DTD约束写在XML内部,这种方式叫做内部引入
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
XML解析
JAXP SAX解析
首先创建一个监听类,响应各种事件
class MyContentHandler extends DefaultHandler { public boolean isContinue = true; public boolean isSearchBook = false; @Override public void startDocument() throws SAXException { super.startDocument(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); if ("书名".equals(qName)) { isSearchBook = true; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); if (isSearchBook && isContinue) { System.out.print(" " + new String(ch, start, length)); isContinue = false; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); } @Override public void endDocument() throws SAXException { super.endDocument(); } }
创建解析工厂、解析器、绑定监听类
public static void main(String[] args) throws Exception { // 创建一个解析工厂 SAXParserFactory saxFactory = SAXParserFactory.newInstance(); // 通过一个解析工厂创建一个解析器 SAXParser saxParser = saxFactory.newSAXParser(); // // 解析器加载要解析的文件 // XMLReader reader = saxParser.getXMLReader(); // reader.setContentHandler(new MyContentHandler()); // reader.parse("test.xml"); // 解析器加载要解析的文件 saxParser.parse(new File("test.xml"), new MyContentHandler()); }
DOM解析
取得根节点
public Element getRootElement() { Document document = null; try { SAXReader reader = new SAXReader(); document = reader.read("test.xml"); } catch (DocumentException e) { e.printStackTrace(); } return document.getRootElement(); }
使用递归读取文件中的所有内容 (内容 节点名 属性)
/** * 使用递归读取文件中的所有内容 (内容 节点名 属性) */ public void getElement(List eleList) { for (int i = 0; i < eleList.size(); i++) { Element ele = (Element) eleList.get(i); if (ele != null && ele.elements().size() > 0) { System.out.println(ele.getName()); System.out.println("属性有: "); List attList = ele.attributes(); for (int j = 0; j < attList.size(); j++) { Attribute att = (Attribute) attList.get(j); System.out.println(att.getName() + " " + att.getValue()); } getElement(ele.elements()); } else { System.out.println(" " + ele.getName() + " " + ele.getText()); System.out.println("属性有: "); List attList = ele.attributes(); for (int j = 0; j < attList.size(); j++) { Attribute att = (Attribute) attList.get(i); System.out.println(att.getName() + " " + att.getValue()); } } } }
为XML增加属性
/** * 增加属性 */ @Test public void addAtt() throws Exception { Document document = null; try { SAXReader reader = new SAXReader(); document = reader.read("test.xml"); } catch (DocumentException e) { e.printStackTrace(); } Element root = document.getRootElement(); Element newEle = DocumentHelper.createElement("优惠价"); Attribute att = DocumentHelper.createAttribute(newEle, "新旧程度", "半新"); newEle.add(att); root.element("书").add(newEle); // FileWriter fileWriter = new FileWriter(new File("test.xml")); Writer writer = new OutputStreamWriter(new FileOutputStream(new File( "test.xml")), "utf-8"); XMLWriter xmlWriter = new XMLWriter(writer, OutputFormat .createCompactFormat()); xmlWriter.write(document); writer.flush(); writer.close(); }
删除元素
@Test public void removeElement() throws Exception { Document document = null; SAXReader reader = new SAXReader(); try { document = reader.read("test.xml"); } catch (DocumentException e) { e.printStackTrace(); } Element root = document.getRootElement(); Element element = root.element("书").element("优惠价"); element.getParent().remove(element); Writer writer = new OutputStreamWriter(new FileOutputStream(new File( "test.xml")), "utf-8"); // XMLWriter xmlWriter = new XMLWriter(writer); // xmlWriter.write(document); document.write(writer); writer.flush(); writer.close(); }
相关文章推荐
- JavaSE_Java DOM 操作 xml
- JavaSE XML操作
- 【JavaSE】day14_XML
- JavaSE 6基于JSR105的XML签名之理论篇
- JavaSE_XML解析__DOM4j_解析原理01
- JavaSE_XML解析__DOM4j_XML写入
- JavaSE_XML解析__JDK自带静态解析
- JAVASE之操作XML
- spring-shiro.xml提供了普通JavaSE独立应用的Spring配置
- JavaSE_XML解析__JDK自带动态解析
- xml文件和数据库数据之间的相互转化(javaSE窗口界面程序)
- JavaSE练习 XML解析-Dom4j使用
- \t\txml文件和数据库数据之间的相互转化(javaSE窗口界面程序)
- 用Javascript,xml parser控制xml文档的逐条显示
- SQL Server 和 XML 的集成
- Python学习笔记-XML大文件的XSD验证方法
- c# winform下sql图片二进制存储/读取/显示/写入XML/读取XML显示
- xml解析之Dom
- C++读XML
- dom4j xml读写修改等操作