您的位置:首页 > 编程语言 > Java开发

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解析
首先创建一个监听类,响应各种事件

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: