JAVASE之XML

 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[内容区]]/>

转义字符

& --> &amp;
< --> &lt;
> --> &gt;
" --> &quot;
' --> &apos;



 

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();
	}

 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值