XML解析

wuchangjian2021-11-11 23:43:13编程学习

1.什么是XML,作用是什么

        可扩展标记语言(Extensible Markup Language ),XML是一种数据格式,类似 HTML,是使用标签进行内容描述的技术,与HTML不 同的是,XML的标签和属性 都是根据业务需求自定义的。

XML在企业开发中主要有两种应用场景:

1)XML可以作为数据交换的载体,也就是说使用XML格式进行数据的传输

2)XML可以作为配置文件的载体。

2.如何去写一个XML(重点)

        XML的编写要比HTML简单,根据实际的业务场景自行编写有意义的标签和属性, 例如创建一个以.xml为后缀名的文件,编写描述一个网上商城的商品信息的xml

编写一个store.xml

<?xml version="1.0" encoding="UTF-8"?>
<store>
    <product category="手机数码">
        <pid>100</pid>
        <pname>华为手机</pname>
        <price>3000</price>
    </product>
    <product category="电脑办公">
        <pid>200</pid>
        <pname>三星笔记本</pname>
        <price>5000</price>
    </product>
    <product category="大型家电">
        <pid>300</pid>
        <pname>海尔洗衣机</pname>
        <price>4000</price>
    </product>
</store>

 xml编写时也要符合一定的规则:

1)xml文件的后缀名是.xml

2)xml有且只有一个根标签

3)xml的标签是尖括号包裹关键字成对出现的,有开始标签有结束标签,关键字是自 定义的,xml也可以有空标签/自关闭标签

4)xml允许有属性,属性也是根据需要自定义的,属性格式:属性=“属性值”,多 个属性之间使用空格隔开

5)xml是区分大小写的

上述xml的组成:

1)文档声明:<?xml version="1.0" encoding="UTF-8"?>

2)根标签,例如:<store>

3)其他标签,例如:<pname>

4)属性,例如:category="电脑办公"

5)文本,例如:三星笔记本

6)注释,例如:<!--这是一个注释-->

7)CDATA区:

CDATA区可以保证数据的原文输出,一些特殊符号也可以输出

例如:<![CDATA[原文显示的内容]]>

3.如何去约束一个XML(了解)

提到约束一个XML,必须要理解为什么对XML要进行约束?

因为XML的标签都是自定义的,xml在作为框架配置时不能很好的规范开发者书写, 所以要使用约束告知开发者怎样去配置一个xml

XML的约束有两种:

1)DTD约束

2)Schema约束

(1)DTD约束

例如:我们要约束上述编写的store.xml,相应 的DTD约束如下

store.dtd

<!ELEMENT store (product+)>
<!ELEMENT product (pid,pname,price)>
<!ELEMENT pid (#PCDATA)>  #PCDATA 表示文本
<!ELEMENT pname (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST product category CDATA #REQUIRED>
                  category是属性名字 CDATA文本  #REQUIRED 表示必须的

 在store.xml中引入本地的DTD文件:

<!DOCTYPE store SYSTEM "store.dtd">

其中:SYSTEM代表本地dtd文件

在store.xml中引入互联网上的DTD文件:

<!DOCTYPE store PUBLIC "//UNKNOWN/" "unknown.dtd">

其中:PUBLIC代表互联网上的DTD

//UNKNOWN/:此位置代表为引入的DTD取一个名称,随意取

unknown.dtd:此位置代表引入的DTD的路径,一般是互联网路径

store.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE store PUBLIC "//UNKNOWN/" "unknown.dtd">
<!-- <!DOCTYPE store SYSTEM "store.dtd"> -->
<store>
	<!-- 这是一个商品 -->
	<product category="手机数码">
		<pid>100</pid>
		<pname>华为手机</pname>
		<price>2588</price>
	</product>
	<product category="电脑办公">
		<pid>200</pid>
		<pname>华硕笔记本</pname>
		<price>4588</price>
	</product>
	<product category="大型家电">
		<pid>300</pid>
		<pname>格力空调</pname>
		<price>3588</price>
	</product>
</store>

例如:

hibernate的核心配置文件的约束

struts2的配置文件的约束

(2)Schema约束

例如:我们要约束上述编写的store.xml,相应 的Schema约束如下

store.xsd

Schema中分为简单元素和复杂元素

简单元素:标签仅仅包含文本标签体的元素

复杂元素:标签包括子标签或属性的元素

sore.xsd内容如下

<?xml version="1.0" encoding="UTF-8"?>
<schema 
	xmlns="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.itcast.cn/217/store" 
	xmlns:tns="http://www.example.org/store" 
	elementFormDefault="qualified">
	<!-- 根标签store -->
	<element name="store">
		<!-- 根标签stroe是一个复杂元素 因为其有子标签 -->
		<complexType>
			<!-- store标签的子标签遵循一定的顺序,其中maxOccurs代表最多10个子元素 -->
			<sequence maxOccurs="10">
				<!-- product元素 -->
				<element name="product">
					<!-- product元素是一个复杂元素,因为其有子元素和属性 -->
					<complexType>
						<!-- product的子元素遵循一定顺序 -->
						<sequence>
							<!-- pid与阿苏 文本的类型是整型 -->
							<element name="pid" type="int"></element>
							<!-- pname元素 文本的类型是字符串 -->
							<element name="pname" type="string"></element>
							<!-- price元素 文本的类型是浮点型 -->
							<element name="price" type="double"></element>
						</sequence>
						<!-- product的category属性 类型是字符串use代表此属性是必须的 -->
						<attribute name="category" type="string" use="required"></attribute>
					</complexType>
				</element>
			</sequence>
		</complexType>
	</element>
</schema>

Schema约束是怎样引入到XML中的?

store.xml

<?xml version="1.0" encoding="UTF-8"?>
<store
	xmlns="http://www.itcast.cn/store"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.itcast.cn/store store.xsd"
>
	<!-- 这是一个商品 -->
	<product category="手机数码">
		<pid>100</pid>
		<pname>华为手机</pname>
		<price>2588</price>
	</product>
	<product category="电脑办公">
		<pid>200</pid>
		<pname>华硕笔记本</pname>
		<price>4588</price>
	</product>
	<product category="大型家电">
		<pid>300</pid>
		<pname>格力空调</pname>
		<price>3588</price>
	</product>
</store>

 例如:

web工程的核心配置文件web.xml

spring的核心配置文件applicationContext.xml

4.如何去解析一个XML(了解)

XML的解析就是将有用的信息从XML文档中解析出来,例如上述的store.xml,怎 样通过API将store.xml中的属性值和文本解析出来。

(1)常用的解析方式

DOM解析:将文档整体加载到内存形成一个DOM树再解析,支持文档的增删改查和文档的回写。

SAX解析:读取一行解析一行,只支持文档的查询,也不支持文档的回写。

PULL解析:类似SAX解析,Android的常用解析技术。

(2)常用的解析技术

JAXP:SUN公司的官方解析技术,支持DOM解析和SAX解析

JSOUP:一种解析HTML的特定解析的开发包

JDOM:开源组织的DOM方式的解析技术

DOM4J:JDOM的分离版,开源,Hibernate底层的XML解析技术

(3)DOM4J解析技术

DOM4J是第三方开源的解析技术,首先要下载dom4j.jar

解析XML的步骤:

//使用原生的dom4j进行解析
@Test
public void test1() throws Exception{

   //目的:使用dom4j的API解析store.xml
   //1、创建解析器
   SAXReader reader = new SAXReader();
   //2、读取xml文件
   Document doc = reader.read("src/main/webapp/WEB-INF/xml/store.xml");
   //3、获取根节点
   Element root = doc.getRootElement();
   //4、根据需求去解析文档中的数据
   System.out.println(root.getName());//store
   //4.1 获得所有的product元素
   List<Element> elements = root.elements();
   System.out.println(elements.size());//3
   //4.2 获得第二个product元素
   Element productElement = elements.get(1);
   //4.3 获得第二个product元素的属性值
   String attributeValue = productElement.attributeValue("category");
   System.out.println(attributeValue);//电脑办公
   //4.4 获得第二个product元素的字标签pname
   Element pnameElement = productElement.element("pname");
   System.out.println(pnameElement.getName());//pname
   //4.5 获得该pname的文本
   String pnameText = pnameElement.getText();
   System.out.println(pnameText);//华硕笔记本
}

 在dom4j的lib目录下有一个jaxen-1.1-beta-6.jar,导入这个jar包可以进行XPath 的解析。

//使用dom4j扩展jar 进行XPath解析
@Test
public void test2() throws Exception{
   //1、创建解析器
   SAXReader reader = new SAXReader();
   //2、读取文件
   Document doc = reader.read("src/main/webapp/WEB-INF/xml/store.xml");
   //3、使用XPath规则进行解析 参数是Xpath规则
   //3.1 获得所有的pname,打印value
   List<Node> nodes = doc.selectNodes("//pname");
   nodes.forEach(n-> System.out.println(n.getText()));
   
   //3.2 获取category=大型家电的pname的值
   Element pnameElement = (Element) doc.selectSingleNode("//product[@category='大型家电']/pname");
   System.out.println(pnameElement.getText());//格力空调
}

 5.XML的实际应用场景(理解)

        实际开发中,我们一般会使用各种各样的框架的进行企业开发,而这些框架一般都会将某些公共的功能写好了,我们需要做的只需要按照框架提供的约束进行框架的配置 就可以了,当我们使用XML配置好框架后,在运行时,框架底层会解析我们配置XML 文档获取有用的信息,从而根据我们的需求实现某些功能。

  所以,实际开发中我们很少会自己编写XML约束和解析XML

相关文章

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。