编写

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>

  


    

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

  1. 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介绍 在前面学习的ht ...

  2. Android基础总结(12)——XML和JSON解析

    XML和JSON解析 在网络上传输数据时最常用的格式有两种:XML和JSON.本文主要就是学习如何对这两种常用的数据格式进行解析. 1.XML和JSON的定义 XML:扩展标记语言 (Extensib ...

  3. XML文件的解析方式

    XML文件4种解析方式分别是:DOM解析,SAX解析,JDOM解析,DOM4J解析.1.基础方法:DOM:与平台无关的官方的解析方式.SAX:Java平台提供的基于事件驱动的解析方式.2.扩展方法(在 ...

  4. (5)微信二次开发 之 XML格式数据解析

    1.首先理解一下html html的全名是:HyperText Transfer markup language 超级文本标记语言,html本质上是一门标记(符合)语言,在html里,这些标记是事先定 ...

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

    XML基础+Java解析XML 一:XML基础 XML是什么: 可扩展的标记语言 XML能干什么: 描述数据.存储数据.传输(交换)数据. XML与HTML区别: 目的不一样 XML 被设计用来描述数 ...

  6. 一起学Android之Xml与Json解析

    概述 在网络中,数据交互通常是以XML和Json的格式进行,所以对这两种格式的数据进行解析,是Android开发中的必备功能,本文以一个简单的小例子,简述Android开发中Xml和Json解析的常用 ...

  7. XML数据的解析

    XML数据的解析 相比于JSON数据解析而言,XML数据解析可能会让更多的童鞋感觉到吃力,对我来说,同样认为JSON数据好像让人感觉比较友好,不过对于程序开发者来说,无非就是这两种数据解析占比较大的部 ...

  8. iOS开发笔记3:XML/JSON数据解析

    这篇主要总结在iOS开发中XML/JSON数据解析过程用到的方法.XML数据解析主要使用SAX方式的NSXMLParser以及DOM方式的GDataXML,JSON数据解析主要使用NSJSONSeri ...

  9. Silverlight项目笔记7:xml/json数据解析、TreeView、引用类型与数据绑定错误、图片加载、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题

    1.xml/json数据解析 (1)xml数据解析 使用WebClient获取数据,获取到的数据实例化为一个XDocument,使用XDocument的Descendants(XName)方法获得对应 ...

随机推荐

  1. 关于HSTS安全协议的全面详细解析

    HTTP 严格传输安全(HSTS)是一种安全功能,web 服务器通过它来告诉浏览器仅用 HTTPS 来与之通讯,而不是使用 HTTP.HSTS是网站从HTTP到HTTPS中网站性能及安全优化非常重要的 ...

  2. 亲, 我们来再重申一遍"=="和"equals的区别

    今天经历的一个事情太丢脸了, 一个学弟向我请教问题, 是这样的: 一个字符串里面含有空格, 不允许使用.trim()和replace方法, 只用if和for将空格去掉, 题目很简单, 一开始我是这样写 ...

  3. Win32 Debug & Release

    今天帮汤老师调试程序,他生成的程序不能运行,怀疑子程序之间编译顺序的问题:我试了之后,也出现同样的问题,但是把Win32 Debug 换成Win32 Release却可以运行了. 网上搜索了下,在CV ...

  4. suse11 sp4(虚拟机) 能ping通主机,但是主机ping不通suse虚拟机

    sese的防火墙没关. 查看防火墙状态: rcSuSEfirewall2 status(必须是root账户,sudo都不行) 关闭防火墙:rcSuSEfirewall2 stop 事实上,防火墙有时候 ...

  5. zoj1004-Anagrams by Stack 【栈 dfs】

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4 Anagrams by Stack Time Limit: 2 Seconds ...

  6. XAMPP下apache部署网站,多个虚拟机(空间)配置

     之 前在 Mac 下一直使用 MAMP 搭建本地 php 环境,因为其强大的组合配置以及方便的 UI 操作.因为公司的电脑是 Windows 的,有时候需要搭建 php 环境来调试一些小东西方便自己 ...

  7. 使用bcp工具对boost库裁剪

    有些时候,我们需要通过源代码来发布我们的产品,在使用了CI工具之后,一般我们要求每天对源码进行构建,以防止代码不可用了还不自知.如果我们使用了Boost库,我们就需要在构建的过程中将Boost同时构建 ...

  8. linux下每次git clone不需输入账号密码的方法

    在~/下, touch创建文件 .git-credentials, 用vim编辑此文件,输入内容格式: ame@zhenyun ~ $touch .git-credentials ame@zhenyu ...

  9. 什么是springMvc的参数绑定?

    参数绑定通俗来讲就是从页面传过来的数据通过SpringMvc进行接收.接收的数据类型可以有: (1)SpringMvc默认支持的类型:request.session.application等. (2) ...

  10. cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'.

    笔者最近学习一些spring mvc,在复制别人代码的时候报这个错.报错来源web.xml,原因是不符合xsd对xml的约束 源文件 <?xml version="1.0" ...