标签:width nts xml解析 溢出 document 直接 pack print ges
编写
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>
<it>www.it.com</it>
</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>
标签:width nts xml解析 溢出 document 直接 pack print ges
原文地址:http://www.cnblogs.com/fjkgrbk/p/analyzeXml.html