day14(xml 编写及解析)

编写

xml的组成:

 1.文档的声明

<?xml version=‘1.0‘ encoding=‘UTF-8‘  standalone=‘yes‘>

    xml              表示标签的名字
    encoding       编码格式
    standalone    标记此文档是否独立

  2.元素(节点),元素属性(使用在不包含标签体中体现)

   a: 包含标签体
                理解: 简括号全部成对儿出现, 所有的数据都用一对儿简括号存储
                例:
                    <student>
                        <name>zhangsan</name>
                        <age>18</age>
                    </student>
        
            b: 不包含标签体
                理解: 只有最外层的一个简括号,括号用/标识结束, 内部的数据都用属性来编写

                <student   name="zhangsan"   age="18"   />

  4.注释

<!-- 注释代码  -->

  5.CDATA区(字符串区)  

<students>
	<student>
		<name>zhangsan</name>
		<url>
			<![CDATA[
				<name>zhangsan</name>
				<age>15</age>
			]]>
		</url>
	</student>
</students>

  

  6.特殊字符

<student>
        <name>zhangsan</name>
        <url>
            &lt;it&gt;www.it.com&lt;/it&gt;
        </url>
    </student>

  7.处理指令(PI:processing Instruction)

  暂不做说明

其他组成部分

  DTD约束文件

在DTD文档中使用ELEMENT关键字来声明一个XML元素。
  ?语法:<!ELEMENT 元素名称 使用规则>
使用规则:
  ?(#PCDATA):指示元素的主体内容只能是普通的文本.(Parsed Character Data)
  ?EMPTY:用于指示元素的主体为空。比如<br/>
  ?ANY:用于指示元素的主体内容为任意类型。
  ?(子元素):指示元素中包含的子元素
  ?定义子元素及描述它们的关系:
–如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。
  ?如: <!ELEMENT FILE (TITLE,AUTHOR,EMAIL)
–如果子元素用"|"分开,说明任选其一。
  ?如:<!ELEMENT FILE (TITLE|AUTHOR|EMAIL)
–用+、*、?来表示元素出现的次数
  ?如果元素后面没有+*?:表示必须且只能出现一次
  ?+:表示至少出现一次,一次或多次
  ?*:表示可有可无,零次、一次或多次
  ??:表示可以有也可以无,有的话只能有一次。零次或一次
?在DTD文档中使用ATTLIST关键字来为一个元素声明属性。
?语法:
        <!ATTLIST 元素名
            属性名1 属性值类型 设置说明
            属性名2 属性值类型 设置说明
            …
        >
?属性值类型:
    –CDATA:表示属性的取值为普通的文本字符串
    –ENUMERATED (DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)
    –ID:表示属性的取值不能重复
?设置说明
    –#REQUIRED:表示该属性必须出现
    –#IMPLIED:表示该属性可有可无
    –#FIXED:表示属性的取值为一个固定值。语法:#FIXED "固定值"
直接值:表示属性的取值为该默认值

   DTD文件编写

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT class  (学生+)>
		<!ELEMENT 学生  (姓名,年龄,性别)>
		<!ELEMENT 姓名  (#PCDATA)>
		<!ELEMENT 年龄  (#PCDATA)>
		<!ELEMENT 性别  (#PCDATA)>

    DTD测试文件

<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE 班级 SYSTEM "Test.dtd">
<class>
	<学生>
		<姓名>张三</姓名>
		<年龄>15</年龄>
		<性别>男</性别>
	</学生>
</class>

 schema约束文件

Schema约束自身就是一个XML文件,但它的扩展名通常为.xsd
一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档。XML Schema对名称空间支持得非常好

理解:
      名称空间: 相当于package
    约束文档: 编写好的Person类
      实例文档: 通过Person类创建对象
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs=‘http://www.w3.org/2001/XMLSchema‘
		targetNamespace=‘http://www.fjklmz.com‘>
				<!-- xmlns   xs:是标准的名称空间 -->
	<xs:element name=‘书架‘ >
		<xs:complexType><!-- 是复杂的标签 -->
			<xs:sequence maxOccurs=‘unbounded‘ ><!-- 有序   无边界 -->
				<xs:element name=‘书‘ ><!-- 元素 -->
					<xs:complexType>
						<xs:sequence>
							<xs:element name=‘书名‘ type=‘xs:string‘ />
							<xs:element name=‘作者‘ type=‘xs:string‘ />
							<xs:element name=‘售价‘ type=‘xs:string‘ />
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

  使用Schema约束文件来编写xml文件

<?xml version="1.0" encoding="UTF-8"?>
<fjk:书架 xmlns:fjk="http://www.fjklmz.com"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://www.fjklmz.com NewXMLSchema.xsd ">
  <书>
    <书名>书名</书名>
    <作者>作者</作者>
    <售价>售价</售价>
  </书>
</fjk:书架>

解析

  解析方式有两种方法

    DOM      Document Object Model 文档对象实类 这种方式是W3C推荐的处理xml的一种方式

      SAX  Simple API for Xml 这种方式不是官方提供的,属于开源社区XML-DEV,几乎所有的Xml解析都支持。

   解析区别

      dom解析 一次性加载全部节点,如果节点太多的话,就会产生节点溢出

      sax 一个节点的一个节点的进行解析

      JAXP     是SUN公司提供的解析标准

      DOM4J  Document for Java   是开源组织的推出的解析开发包

      log4j     日志文件

* Dom4J的常用方法:
 * 		Document
 * 			 Element getRootElement() :获取根元素对象(根标签)
 * 		Element
 * 			 List elements() :获取所有的子元素
 * 			 List elements(String name):根据指定的元素名称来获取相应的所有的子元素
 * 			 Element element(String name):根据指定的元素名称来获取子元素对象,如果元素名称重复,则获取第一个元素
 * 			 String	elementText(String name) :根据指定的子元素名称,来获取子元素中的文本
 * 			 String	getText() :获取当前元素对象的文本
 * 			 void setText(String text):设置当前元素对象的文本
 * 			 String	attributeValue(String name):根据指定的属性名称获取其对应的值
 * 			 public Element addAttribute(String name,String value):根据指定的属性名称和值进行添加或者修

  

  MyXml.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<class GDP="999块">
	<students><!-- 学生一 -->
		<student>
			<name>JJ</name>
			<age>15</age>
		</student><!-- 学生二 -->
		<student>刘欢</student>
		<student>
			<name>周杰伦</name>
			<age>30</age>
		</student>
		<Student>
			<name>孙红雷</name>
			<age>15</age>
		</Student>
	</students>
</class>

  

      编写工具类

public class Dom4JUtils {
	private Dom4JUtils(){//把构造方法私有化      }
	public  static Document getDocument() throws Exception{//加载文件的所有节点
		SAXReader reader = new SAXReader();
        Document document = reader.read("src\\day14\\MyXml.xml");
        return document;
	}
	public static void writerXml(Document document) throws IOException{//写回到xml文件中去
		OutputFormat opf=OutputFormat.createCompactFormat();
		opf.setEncoding("UTF-8");
		XMLWriter writer=new XMLWriter(new FileOutputStream("src\\day14\\MyXml.xml"));
		writer.write(document);
		writer.close();
	}
}
  Element getRootElement() :获取根元素对象(根标签)
public class TestXml {
	public static void main(String[] args) throws Exception {
		//Element getRootElement() :获取根元素对象(根标签)
		Document document = Dom4JUtils.getDocument();
		Element rootElement = document.getRootElement();
		System.out.println(rootElement.getName());//输出为Class
	}
}

  List elements() :获取所有的子元素

public class TestXml {
	public static void main(String[] args) throws Exception {
		//Element getRootElement() :获取根元素对象(根标签)
		Document document = Dom4JUtils.getDocument();
		Element rootElement = document.getRootElement();
		System.out.println(rootElement.getName());          //List elements()  获取所有的子元素
		List<Element> elements = rootElement.elements();//因为只有一个子节点  所以只输出一个子节点  students
		for (Element element : elements) {
			System.out.println(element.getName());
		}
	}
}

  List elements(String element);//根据指定元素名称来获取相应的所有的子元素

public class TestXml {
	public static void main(String[] args) throws Exception {
		//Element getRootElement() :获取根元素对象(根标签)
		Document document = Dom4JUtils.getDocument();
		Element rootElement = document.getRootElement();
		// List elements(String name):根据指定的元素名称来获取相应的所有的子元素
		List<Element> elements = rootElement.elements();
		Element element2 = elements.get(0);
		List<Element> elements2 = element2.elements("student");
		for (Element element : elements2) {
			System.out.println(element.getName());
		}
	}
}

输出结果:

  student
  student
  student

  Element element();//根据指定元素获取子元素对象,如果有多个则返回第一个

public class TestXml {
	public static void main(String[] args) throws Exception {
		//Element getRootElement() :获取根元素对象(根标签)
		Document document = Dom4JUtils.getDocument();
		Element rootElement = document.getRootElement();
		//Element element(String name):根据指定的元素名称来获取子元素对象,如果元素名称重复,则获取第一个元素
		Element element = rootElement.element("students");//students
		System.out.println(element.getName());
	}
}

     String elementText(String name) :根据指定的子元素名称,来获取子元素中的文本

     String getText() :获取当前元素对象的文本

public class TestXml {
	public static void main(String[] args) throws Exception {
		//Element getRootElement() :获取根元素对象(根标签)
		Document document = Dom4JUtils.getDocument();
		Element rootElement = document.getRootElement();
		//String	getText() :获取当前元素对象的文本
		List<Element> elements = rootElement.elements();
		List<Element> elements2 = elements.get(0).elements();
		//String	elementText(String name) :根据指定的子元素名称,来获取子元素中的文本
		System.out.println(elements2.get(0).elementText("name"));//JJ
		List<Element> elements3 = elements2.get(0).elements();
		System.out.println(elements3.get(0).getText());//获取name元素的值  JJ
	}
}

  setText(); 修改标签内容

public class TestXml {
	public static void main(String[] args) throws Exception {
		//Element getRootElement() :获取根元素对象(根标签)
		Document document = Dom4JUtils.getDocument();
		Element rootElement = document.getRootElement();
		List<Element> elements = rootElement.elements();
		List<Element> elements2 = elements.get(0).elements();
		List<Element> elements3 = elements2.get(0).elements();
		// void setText(String text):设置当前元素对象的文本
		elements3.get(0).setText("JAY");
		System.out.println(elements3.get(0).getText());//获取修改后的name元素的值  JAY
	}
}

   public Element addAttribute(String name,String value):根据指定的属性名称和值进行添加或者修

public class TestXml {
	public static void main(String[] args) throws Exception {
		//Element getRootElement() :获取根元素对象(根标签)
		Document document = Dom4JUtils.getDocument();
		Element rootElement = document.getRootElement();
	//public Element addAttribute(String name,String value):根据指定的属性名称和值进行添加或者修
		rootElement.addAttribute("name", "WLGC");
		Dom4JUtils.writerXml(document);
	}
}

  MyXml.xml文件被修改

<class GDP="999块" name="WLGC">

  

  添加功能  addElement(String Element);

public class TestXml {
	public static void main(String[] args) throws Exception {
		//Element getRootElement() :获取根元素对象(根标签)
		Document document = Dom4JUtils.getDocument();
		Element rootElement = document.getRootElement();
		Element studentElement = rootElement.addElement("student");
		Element nameElement = studentElement.addElement("name");
		nameElement.setText("孙楠");
		Element ageElement = studentElement.addElement("age");
		ageElement.setText("35");
		//设置文本
		Dom4JUtils.writerXml(document);
	}
}

  

	<student>
		<name>孙楠</name>
		<age>35</age>
	</student>

    删除功能 remove

public class TestXml {
	public static void main(String[] args) throws Exception {
		//Element getRootElement() :获取根元素对象(根标签)
		Document document = Dom4JUtils.getDocument();
		Element rootElement = document.getRootElement();//students
		List<Element> elements = rootElement.elements();//student
		List<Element> elements2 = elements.get(0).elements();//第一个student
		Element element = elements2.get(4);
		//移除时  必须使用它的父节点删除它的子节点
		element.remove((Element)element.elements().get(0));
		Dom4JUtils.writerXml(document);
	}
}


<student>

		<age>35</age>
	</student>

  

插入到指定位置
public class TestXml {
	public static void main(String[] args) throws Exception {
		//Element getRootElement() :获取根元素对象(根标签)
		Document document = Dom4JUtils.getDocument();
		Element rootElement = document.getRootElement();//students
		Element createElement = DocumentHelper.createElement("student");
		Element nameElement = createElement.addElement("name");
		nameElement.setText("张信哲");
		Element ageElement = createElement.addElement("age");
		ageElement.setText("55");
		 List<Element> elements = rootElement.elements();//student
		 elements.get(0).elements().add(1, createElement);
		Dom4JUtils.writerXml(document);
	}
}

 



<student>
			<name>JJ</name>
			<age>15</age>
		</student><!-- 学生二 -->
		<student>
			<name>张信哲</name>
			<age>55</age>
		</student>
		<student>刘欢</student>

  


    

时间: 2024-12-23 05:18:51

day14(xml 编写及解析)的相关文章

xml语法、DTD约束xml、Schema约束xml、DOM解析xml

今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的html语言,html是超文本标记语言,使用html语言规定好的标签来封装文本数据.而html使用的标签html语言规定好的,每个标签都有自己特定的功能. xml语言,可扩展的标记语言,这门语言它没有定义任何的标记,而标记是由使用者自己来定义,但是由于标签名称以及属性名称都由用户自己来命名,导致别人在使

xml基础及其解析xml文档

xml基础及其解析xml文档 xml基础及其解析xml文档 xml基础语法 中国特色乱码问题 写xml文件的工具 xml中使用的转义字符 处理指令已经过时 xml的两个重要的功能 xml注释 xml解析Java应用程序读取xml文件的内容 xml解析原理 xml解析工具 DOM4J使用 DOM4J中核心API 将xml文档从磁盘读进内存形成Document对象 读取所有的标签节点 读取所有的属性节点 读取所有的文本节点 解决上面提出的问题 xml基础语法 一个基本的xml构成: <!--vers

iOS开发网络篇—XML数据的解析

iOS开发网络篇—XML数据的解析 iOS开发网络篇—XML介绍 一.XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是常用的一种用于交互的数据格式,一般也叫XML文档(XML Document) XML举例 <videos> <video name="小黄人 第01部" length="30" /> <video name="小黄人 第02部&qu

XML基础+Java解析XML +几种解析方式的性能比较

XML基础+Java解析XML 一:XML基础 XML是什么: 可扩展的标记语言 XML能干什么: 描述数据.存储数据.传输(交换)数据. XML与HTML区别: 目的不一样 XML 被设计用来描述数据,其焦点是数据的内容. HTML 被设计用来展示数据,其焦点是数据的外观. HTML可以不关闭标签(即标签可以不成对出现),但XML必须关闭标签(即标签必须成对出现). HTML中的标签标识文本如何展示,而XML中的标签标识文本是什么含义(什么类型的文本). XML文档节点类型 u     文档(

Java学习总结(21)——XML文档解析:DOM解析,SAX解析

一.XML简介1.可扩展性标记语言(eXtensible Markup Language)2.XML用于描述数据3.应用场合:(1)持久化存储数据(2)数据交换(3)数据配置4.XML语法(1)文档类型:在编写XML文档时,需要先使用文档声明,声明XML文档的类型.最简单的声明语法:<?Xml version="1.0" ?>用encoding属性说明文档的字符编码:<?Xml version="1.0" encoding="GB2312

安卓xml文档解析

2014-12-27   14:53:32 解析xml文档 用xml文档存储数据 1.获得文件的路径 1 File path = new File(Environment.getExternalStorageDirectory(), "persons.xml"); 2.建立文件输出流 1 FileInputStream fis = new FileInputStream(path); 3.获得xml文档解析器对象 1 XmlPullParser parser=Xml.newPullPa

jaxp解析XML之DOM解析

XML解析技术XML解析方式分为三种一种是DOM解析一种是SAX解析 DOM思想:将整个xml加载入内存,形成围挡对象,所有对xml操作都是对内存中节点对象进行,DOM是官方xml解析标准,同时支持解析其他各种语言 SAX解析方式的出现,因为DOM的解析方式需要对文档进行加载入内存,当文档较大的时候比较消耗资源,这时候就出现了SAX解析SAX思想:一边解析,一边处理,一边释放资源 在JDK6中又引入了另一种StAX解析方式是一种拉模式的xml解析方式,而SAX是一种推模式XML解析方式推模式由服

Android解析XML之SAX解析器

SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理.在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为. SAX解析器的优点是解析速度快,占用内存少.非常适合在Android移动设备中使用. SAX相关类及API DefaultHandler:是一个事

xml文件以及解析

1.创建一个xml文件 <?xml version="1.0" encoding="UTF-8"?> <!-- xml:是一个可扩展的标记语言 01.很像超文本标记语言(html) 02.xml文件着重保存或者传输数据,不专注显示 03.无需预编译 04.符合w3c标准 < : < > : > " : " ' : &apos; & : & <![CDATA[代码]]>