XML知识详解

XML

        说明:
            xml是一种扩展性的标记语言,关注数据本身。
        作用:
            1、数据存储、数据描述、数据交互
            2、配置文件  (web项目的web.xml文件、spring框架的spring.xml等)
        要求:
            文档的后缀名是 xml
            每个文档有且仅有一个根元素,所谓根元素就是包含了其他所有元素的元素。
            XML 目前只有一个版本,即 1.0.XML 是自描述数据,使用现有的国际标准。    
        语法规范:
            1) 必须有 xml 文档声明
                <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
                    <?          表示文档的开始
                    xml            表示当前是xml文档
                    ?>            表示文档的结束
                    version        表示xml文档的版本,目前只有1.0
                    encoding    表示文档的编码格式
                    standalone    表示文档是否独立存在
                注:文档声明必须写在xml文件中的第一行,顶格写,不能出现空格和换行。                
            2) 必须有且仅有一个根元素
            3) 严格区分大小写
            4) 属性值用引号(双引号或单引号) :等号分开的名称-值对;在一个元素上,相同的属性只能出现一次
            5) 标记成对;
            6) 空标记关闭;
            7) 元素正确嵌套。
            
        元素命名规则:
            1) 名称中可以包含字母、数字或者其他可见字符;
            2) 名称不能以数字开头;
            3) 不能以 XML/xml/Xml…开头;
            4) 名称中不能含空格;
            5) 名称中不能含冒号(注:冒号留给命名空间使用)
            
         实体:
            实体叫 ENTITY,实体的作用是避免重复输入。作用相当于宏或者变量。
            1) 内置的 5 种实体
                实体     符号
                &lt;     < 
                &gt;     > 
                &amp;    & 
                &quot;     " 
                &apos;     '

            2) 自定义实体
                <!DOCTYPE 根元素[ 
                    <!ENTITY 实体名 "实体内容"> 
                ]>
            2) 使用实体
                &实体名;
        文档类型声明:
            文档类型定义——DOCTYPE,文档类型声明,紧跟 XML 声明之后,包含所有实体声明
            
        构成:    
            1、元素
            2、属性
            3、实体
            4、PCDATA
                被解析的字符数据(被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 的内置实体来分别替换它们。)
            5、CDATA
                用于把整段文本解释为纯字符数据而不是标记的情况。如包含大量的<、>、&、或者" 字符。
                CDATA 节中的所有字符都会被当做元素字符数据的常量部分,而不是 XML 标记,可以输入除]]>外任意字符,不能嵌套。
                格式:
                    <![CDATA[ ...... ]]>

<?xml version="1.0" encoding="UTF-8" standalone="yes"  ?>
<!-- 自定义实体-->
<!DOCTYPE people[
	<!-- 定义实体 -->
	<!ENTITY xb "男" >
	<!ENTITY nl "18" >
]>


<people> 
	<person  sex='1' id="1">
		<name>张三</name>
		<age>&nl;</age>
		<height>&amp;</height>
	</person>
		
	<person  sex="0">
		<name>李四</name>
		<age>19</age>
		<usex>&xb;</usex>
		<desc><![CDATA[战国时期,芈月是楚威王最宠爱的<小公主,但<desc>在楚威王
死后生活一落千丈,母亲向氏被楚威后逐出宫,芈月&弟弟芈戎躲过了一次次灾难和危机。
芈月与楚公子黄歇青梅竹马,真心相爱,但被作为嫡公主芈姝的陪嫁>媵侍远嫁秦国。芈姝当
上了秦国的王后,芈月不得已成为宠妃...]]></desc>
	</person>
</people>

用DOM解析:
    ① 建 立 DocumentBuilderFactory : DocumentBuilderFactory factory =  DocumentBuilderFactory.newInstance(); 
    ② 建立 DocumentBuilder: DocumentBuilder builder = factory.newDocumentBuilder(); 
    ③ 建立 Document : Document doc = builder.parse(“要解析的文件路径”); 
    ④ 建立 NodeList : NodeList nl = doc.getElementsByTagName(“读取节点”); 
    ⑤ 进行 XML 信息读取

public class DomParser02 {
	public static void main(String[] args) {
		try {
			// 建 立 DocumentBuilderFactory解析工厂
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			// 建立 DocumentBuilder解析器
			DocumentBuilder builder = factory.newDocumentBuilder();
			// 解析xml文件,得到Document对象
			Document document = builder.parse("src/day01-test.xml");
			// 获取指定节点的节点对象
			NodeList nameNodeList = document.getElementsByTagName("name");
			//要获得所有的要遍历获取,上述获取的是个列表
			// 获取指定节点的文本
			System.out.println(nameNodeList.item(0).getTextContent());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

解析XML可以用SAX或着DOM,但是主流掌握第三方的DOM4J,或着JDOM

SAX是通过事件流,按流的模式,走一点拿一点,不可回退,效率高一点

DOM基于整个文档,要在所有文档加载结束后在操作,一级级找

用DOM4J或着JDOM更加方便!!!!!!!!!!!!

//要先把DOM4J的插件引入
//对于上述图片的解析
public class Dom4JParser {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) throws Exception {
		// 1、得到要解析文件对象 file对象
		File file = new File("src/day01-test.xml");
		// 2、得到解析器
		SAXReader reader = new SAXReader();
		// 3、通过解析器将file文件解析成Document对象
		Document document = reader.read(file);
		// 4、得到文档对象的根元素对象  Element对象
		Element rootElement = document.getRootElement(); // people
		//System.out.println(rootElement.getName());
		// 5、根元素对象的所有子节点,返回迭代器
		Iterator<Element> iterator = rootElement.elementIterator();
		// 6、遍历迭代器,得到元素名称和文本
		while(iterator.hasNext()) {
			Element element = iterator.next();
			System.out.println("Name:" + element.getName());
			System.out.println("Text:" + element.getText());
			System.out.println("StringValue:" + element.getStringValue());
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值