zoukankan      html  css  js  c++  java
  • xml

    xml

    extensible markdown language

    <?xml version="1.0" encoding="utf-8"?>
    <!--引入dtd-->
    <!-- 文档类型 根标签名字 网络上的dtd dtd名称 dtd的路径-->
    
    <persons>
    	<person>
    		<name id="123">老张</name>
    		<age>18</age>
    		<commit><![CDATA[<a href="www.baidu.com"><ds>34</ds></a>]]></commit>
    	</person>
    	<person>
    		<name id="143">老李</name>
    		<age>19</age>
    		<commit><![CDATA[<a href="www.baidu.com"><ds>24</ds></a>]]></commit>
    	</person>
    </persons>
    

    CDATA区 让xml解析器,将特殊字当作文本,而不是当成标签来解析

    xml解析方式

    常用的有两种

    DOM

    (Document Object Model)

    将整个xml读入内存,形成树形结构来解析,可以进行增删改查操作

    SAX

    (Simple API for XML)

    读取一行,解析一行。只能查询

    解析手段

    dom4j

    //SAX解析
    		//1.创建SAXReader对象
    		SAXReader reader=new SAXReader();
    		try {
    			//2.获取xml源
    			Document document=reader.read(new File("src/main/resources/test.xml"));
    			//3、得到元素
    			//根元素
    			Element root=document.getRootElement();
    			//
    			System.out.println(root.element("person").element("age").getText());
    			//
    			List<Element> list=root.elements("person");
    			for(Element e:list) {
    				Element name=e.element("name");
    				Element age=e.element("age");
    				System.out.println(name.getName()+":"+name.getText()+","+age.getName()+":"+age.getText());
    			}
    		
    		} catch (DocumentException e) {
    			e.printStackTrace();
    		}
    	}
    

    xpath

    //SAX解析
    		//1.创建SAXReader对象
    		SAXReader reader=new SAXReader();
    		try {
    			//2.获取xml源
    			Document document=reader.read(new File("src/main/resources/test.xml"));
    			//3、得到元素
    			//根元素
    			Element root=document.getRootElement();
    			
    			Element name=(Element)root.selectSingleNode("/persons/person/name");
    			System.out.println(name.getText());
    			
    			/*
    			/tagname 表示获取该目录直接下层中标签名为tagname的元素
    			//tagname 表示 获取该目录子孙层中所有标签名为tagname的标签
    			*/
    			List<Element> names=root.selectNodes("//name");
    			for(Element n:names) {
    				System.out.println(n.getName()+":"+n.getText()+"--"+n.attributeValue("id"));
    			}
    		
    		} catch (DocumentException e) {
    			e.printStackTrace();
    		}
    

    XML约束

    DTD

    (Document Type Definition)语法自成一派,可读性较差

    <!--test.dtd-->
    <!-- 元素格式 <!ELEMENT 元素名称  元素类型> -->
    <!ELEMENT persons (person)+>
    <!ELEMENT person (name,age,commit)>
    <!-- #PCDATA表示标签的值是被解析的文本 (Parser Character Data) -->
    <!ELEMENT name (#PCDATA)> 
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT commit (#PCDATA)>
    
    <!--属性格式-->
    <!--<!ATTLIST 元素名称 属性名称 属性类型 默认值>	-->
    <!ATTLIST name id CDATA #IMPLIED>
    
    <!---test.xml->
    <?xml version="1.0" encoding="utf-8"?>
    <!-- 引入dtd -->
    
    <!-- 1.引入网络上的dtd   <!DOCTYPE 根元素名称 	PUBLIC	"dtd名称"	"dtd的路径">
    	<!DOCTYPE persons PUBLIC "//UNKNOWN/" "unknown.dtd">
    -->
    
    <!-- 2.引入外部文件  <!DOCTYPE 根元素名称  SYSTEM "dtd路径">
    	<!DOCTYPE persons SYSTEM "unknown.dtd">
    -->
    
    <!-- 3.直接嵌入dtd
    	<!DOCTYPE 根元素名称[
    		约束
    	]>
     -->
    <!DOCTYPE persons SYSTEM "test.dtd">
    
    <persons>
    	<person>
    		<name id="_123">老张</name>
    		<age>18</age>
    		<commit><![CDATA[<a href="www.baidu.com"><ds>34</ds></a>]]></commit>
    	</person>
    	<person>
    		<name id="_143">老李</name>
    		<age>19</age>
    		<commit><![CDATA[<a href="www.baidu.com"><ds>24</ds></a>]]></commit>
    	</person>
    </persons>
    

    Schema

    使用xml语法规则,xml解析器,解析起来较为方便。

    <!-- test.xsd -->
    <?xml version="1.0" encoding="UTF-8"?>
    
    <!-- 
    	xmlns(xml namespace) 命名空间-w3c制定 
    	targetNamespace 目标命名空间 
    	elementFormDefault 元素的格式化情况 
    -->
    
    
    <schema xmlns="http://www.w3.org/2001/XMLSchema"
    	targetNamespace="http://www.example.org/test"
    	elementFormDefault="qualified">
    
    	<element name="persons">
    		<!-- complexType 用于声明persons标签是复杂元素 -->
    		<complexType>
    			<!-- 复杂元素:
    				<sequence> 表明元素必须按照顺序出现。 
    				<all> 元素的顺序可以任意。 但是元素出现的次数有且仅有一次。 
    				<choice> 简单元素只能出现其中的一个。
    			 -->
    			<sequence maxOccurs="unbounded">
    				<element name="person">
    					<complexType>
    						<sequence>
    							<!-- 简单元素 -->
    							<element name="name" type="string"></element>
    							<element name="age" type="integer"></element>
    							<element name="commit" type="string"></element>
    						</sequence>
    						<!-- 属性:只能出现在复杂元素中 -->
    						<attribute name="id" type="int" use="optional"></attribute>
    					</complexType>
    				</element>
    			</sequence>
    		</complexType>
    	</element>
    </schema>
    
    <!-- test.xml -->
    <?xml version="1.0" encoding="utf-8"?>
    <!-- 对Schema的引用 -->
    
    
    <!-- 
    	在根标签中引用
    	xmlns:xsi (xml schema instance)	值固定
    	xmlns 填写schema中的targetNamespace,可以指定命名空间名
    		名称空间的作用是在写元素时,可以指定该元素使用的是哪一套约束规则
    	xsi:schemaLocation="{namespace} {location}"
     -->
    <persons 
    
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    	xmlns:aa="http://www.example.org/test"
    	xmlns="http://www.example.org/test"
    	
    	xsi:schemaLocation="http://www.example.org/test test.xsd"
    >
    	<person id="123">
    		<aa:name >老张</aa:name>
    		<age>18</age>
    		<commit><![CDATA[<a href="www.baidu.com"><ds>34</ds></a>]]></commit>
    	</person>
    	<person id="143">
    		<name >老李</name>
    		<age>19</age>
    		<commit><![CDATA[<a href="www.baidu.com"><ds>24</ds></a>]]></commit>
    	</person>
    </persons>
    

    一个xml只能指定一个DTD,但可以指定多个schema

  • 相关阅读:
    pku 1077 Eight
    poj 1700 过河问题 贪心法
    字典树
    [转] 解读IntelliJ IDEA的优缺点
    【转】STL 容器类内部实现
    Google Chrome太强大了
    【转】从哈希存储到Bloom Filter
    [转]我的多年羽毛球自学心得
    好书推荐
    【转】C++错误中英文对照表
  • 原文地址:https://www.cnblogs.com/mznsndy/p/12813722.html
Copyright © 2011-2022 走看看