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>

  








    

原文地址:https://www.cnblogs.com/fjkgrbk/p/analyzeXml.html