XML

XML介绍

​ XML是一种可扩展的标记语言。

​ xml 和 Html 语 言 由 同 一 种 父 语 言 SGML(Standard Generalized MarkupLanguage,标 准通用标记语言)发展出来的两种语言。

​ xml 由 html 发展而来,与 html 格式相似,但是比 html 严格。XML 描述的是结构、内容和语义,它不描述页面元素的格式化。HTML 侧重于如何表现信息,内容描述与显示整合为一体。XML 中的每个元素名都是成对出现的,结束标签前加一个。

  • XML的作用:
    • 存储、交换数据
    • 配置文件

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. 元素正确嵌套

元素命名规则

  • 名称中可以包含字母、数字或者其他可见字符
  • 名称不能以数字开头
  • 不能以 XML/xml/Xml…开头
  • 名称中不能含空格
  • 名称中不能含冒号(注:冒号留给命名空间使用)

实体

  • 内置实体

    &lt;     <
    &gt;     >
    &amp;    &
    &quot;   "
    &apos;   ' 
    
  • 自定义实体

    <!DOCTYPE 根元素[
    	<!ENTITY 实体名 "实体内容"> 
    ]>
    
    • 使用实体:&实体名;

XML的组成

  • 声明

  • 元素

  • 属性

  • CDATE

    • CDATA 节中的所有字符都会被当做元素字符数据的常量部分,而不是 XML 标记,可以输入除]]>外任意字符,不能嵌套

      <![CDATA[ ...... ]]>
      
  • PCDATA

    • PCDATA 的意思是被解析的字符数据(parsed character data)
    • 可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本

XML解析

  • 基本的解析方式有两种:一种叫 SAX,另一种叫 DOM。

  • SAX(Simple API for XML)是基于事件流的解析,DOM(Document Object Model)是基于 XML 文档树结构的解析。

  • SAX:效率高,数据量小,仅一次获取;DOM:整颗树加载到内存中,耗内存,可多次获取。

DOM解析

  • 解析步骤:

    1. 建 立 DocumentBuilderFactory : DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    2. 建立 DocumentBuilder: DocumentBuilder builder = factory.newDocumentBuilder();
    3. 建立 Document : Document doc = builder.parse(“要解析的文件路径”);
    4. 建立 NodeList : NodeList nl = doc.getElementsByTagName(“读取节点”);
    5. 进行 XML 信息读取
    public static void main(String[] args) throws Exception {
        // ① 建 立 DocumentBuilderFactory 
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // ② 建立 DocumentBuilder
        DocumentBuilder builder = factory.newDocumentBuilder();
        // ③ 建立 Document
        Document document = builder.parse("src/test.xml");
        // ④ 建立 NodeList
        NodeList nodeList = document.getElementsByTagName("people");
        // 遍历节点集合
        for (int i = 0; i < nodeList.getLength(); i++) {
            // 获取节点对象
            Node node = nodeList.item(i);
            // 获取节点信息
            String name = node.getNodeName();
            System.out.println("根节点:" + name);
    
            // 判断people节点下的子节点的类型
            short nodeType = node.getNodeType();
            System.out.println("people的nodeType:" + nodeType);
            System.out.println("元素节点:" + Node.ELEMENT_NODE);
            System.out.println("文本节点:" + Node.TEXT_NODE);
            // 获取people节点下的子节点 (person)
            NodeList nodeList2 = node.getChildNodes();
            // 遍历子节点
            for(int j = 0; j < nodeList2.getLength(); i++) {
                Node node2 = nodeList2.item(i);
                System.out.println("people的子节点的nodeType:" + node2.getNodeType());
                // 判断是否是元素节点
                if (Node.ELEMENT_NODE == node2.getNodeType()) { // 元素节点
                    // 获取person的子节点
                    NodeList nodeList3 = node2.getChildNodes();
                    // 遍历person的子节点
                    for (int a = 0; a < nodeList3.getLength(); a++) {
                        if (nodeList3.item(i).getNodeName().equals("name")) {
                            System.out.println(nodeList3.item(i).getTextContent());
                        }
                    }
                }
            }        
        }
        // 也可以直接根据子节点直接取值
        NodeList nodeList = document.getElementsByTagName("name");
        System.out.println(nodeList.item(0).getTextContent());		
        NodeList nodeList2 = document.getElementsByTagName("sex");
        System.out.println(nodeList2.item(0).getTextContent());
    }
    
  • DOM 操作除了可以进行解析外,也可以进行文档的生成

    • 如果想要生成 XML 文件,则在创建文档的时候,就应该使用 newDocument()方法
    • 如果要将 DOM 的文档输出,本身是比较麻烦的 。一次编写多次 copy
    package com.shsxt.xml;
    
    import java.io.File;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    
    public class DomWriter {	
    	/**
    	 * 写入xml
    	 * @param args
    	 * @throws Exception 
    	 */
    	public static void main(String[] args) throws Exception {
    		
    		//获取解析器工厂 
    		DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); 
    		//获取解析器 
    		DocumentBuilder builder = factory.newDocumentBuilder(); 
    		//创建文档 
    		Document doc=builder.newDocument(); 
    		
    		//创建元素、设置关系 
    		Element root=doc.createElement("people"); 
    		doc.appendChild(root); // 将根节点追加到文档对象中
    		
    		Element person=doc.createElement("person"); 
    		root.appendChild(person);// 将person节点追加到根节点中
    				
    		Element name=doc.createElement("name"); 
    		person.appendChild(name); // 将name节点追加到person节点中
    		Element age=doc.createElement("age"); 
    		person.appendChild(age);// 将age节点追加到person节点中
    		
    		name.appendChild(doc.createTextNode("Lily")); // 创建文本节点,并设置到name节点中
    		age.appendChild(doc.createTextNode("10")); // 创建文本节点,并设置到age节点中
    		 			 
    		//写出去 
    		// 获得变压器工厂 
    		TransformerFactory tsf = TransformerFactory.newInstance(); 
    		Transformer ts = tsf.newTransformer(); 
    		//设置编码 
    		ts.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
    		//创建带有DOM节点的新输入源,充当转换Source树的持有者 
    		DOMSource source=new DOMSource(doc); 
    		//充当转换结果的持有者 
    		File file=new File("src/output.xml"); 
    		StreamResult result=new StreamResult(file); 
    		ts.transform(source, result); 				
    	}
    }
    

DOM4J解析

  • 解析步骤:

    1. 获取解析的文件对象
    2. 获取解析器
    3. 获取指定文件的文档对象
    4. 获取文档的根元素
    5. 根据根元素找到全部的子节点
    package com.shsxt.xml;
    
    import java.io.File;
    import java.util.Iterator;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    public class Dom4JParser {
    	/**
    	 * @param args
    	 * @throws Exception 
    	 */
    	public static void main(String[] args) throws Exception {
    		// 1、获取解析的文件对象
    		File file = new File("src/test.xml"); 
    		// 2、获取解析器
    		SAXReader reader = new SAXReader(); 
    		// 3、获取指定文件的文档对象
    		Document doc = reader.read(file); 
    		// 4、获取文档的根元素 
    		Element root = doc.getRootElement(); 
    		System.out.println(root.getName());
    		// 5、根据跟元素找到全部的子节点 
    		Iterator<Element> iter = root.elementIterator(); 		
    		while(iter.hasNext()){ 
    			Element name = iter.next(); 
    			System.out.println("name:"+ name.getName()+", value:" + name.getStringValue()); 
    		}				
    	}
    }
    
  • 使用 DocumentHelper 来创建 Document 对象

    package com.shsxt.xml;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.UnsupportedEncodingException;
    import org.dom4j.Document;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.XMLWriter;
    
    public class Dom4jWriter {
    	public static void main(String[] args) throws Exception {		
    		// 使用DocumentHelper来创建 Document对象 
    		Document document = DocumentHelper.createDocument(); 
    		// 创建元素并设置关系 
    		Element person = document.addElement("person"); 
    		Element name = person.addElement("name");  
    		Element age = person.addElement("age"); 
    		// 设置文本 
    		name.setText("Lily"); 
    		age.setText("10"); 
    		// 创建格式化输出器 
    		OutputFormat of = OutputFormat.createPrettyPrint(); 
    		of.setEncoding("utf-8"); 
    		// 输出到文件 
    		File file = new File("src/outputdom4j.xml");
    		FileOutputStream fos = new FileOutputStream(new File(file.getAbsolutePath()));
    		XMLWriter writer = new XMLWriter(fos,of); 
    		// 写出 
    		writer.write(document); 
    		writer.flush(); 
    		writer.close();	
    	}
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值