• 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>
    

      








        

  • 相关阅读:
    Delphi播放铃声
    小技巧
    Delphi线程中使用waitfor返回值
    window安装、启动consul
    kali2020-bash: openvas-setup:未找到命令 ,解决办法
    zookeeper 客户端
    redis 集群
    activeMQ
    Shiro
    Eclipse Java注释模板设置详解
  • 原文地址:https://www.cnblogs.com/fjkgrbk/p/analyzeXml.html
Copyright © 2020-2023  润新知