1. 程式人生 > >可擴展標記語言XML(淅淅瀝瀝的小雨)

可擴展標記語言XML(淅淅瀝瀝的小雨)

ogr 部分 cti AD 標簽 引入 throws jdom 官方

XML簡述

  XML用於描述數據,是當前處理結構化文檔信息的有力工具。與操作系統編程語言的開發平臺無關,可以實現不同系統之間的數據交互。

  xml文件結構:

1 <?xml version="1.0" encoding="UTF-8" ?>
2 <people>
3     <Name>姓名</Name>
4     <Sex>性別</Sex>
5 </people>

代碼中第一行是XML聲明,它一般在XML文檔的第一行。它由兩個部分組成:

    version:文檔符合XML1.0規範。

    encoding:文檔字符編碼,默認為“UTF-8”。

    <!--註釋-->為註釋語法。

XML語言有3個特點:

    1.XML中的每對標記通常被稱為節點,他們是成對出現而且必須成對出現的,用來描述這個節點存儲的內容。在節點中存儲該節點的信息。

    2.XML中用於描述數據的各個節點可以自由橫向擴展和縱向擴展,即可以向下擴展也可以向內擴展(嵌套)。

    3.XML文件中的節點嚴格區分大小寫。例:<Name>名字</Name>和<name>名字</name>這兩個節點內容相同,但節點名稱不一樣,即是兩個節點。

在C#中操作XML文件

  在C#中操作並解析XML文件分為6個步驟:

技術分享圖片
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Xml;               //1.引入命名空間
 7 
 8 namespace Demo
 9 {
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             XmlDocument doc = new XmlDocument();                                //2.創建XML文件對象
15             doc.Load("Path.xml");                                               //3.從指定路徑讀取整個XML文件的結構
16             XmlNode nodes = doc.DocumentElement;                                //4.獲取XML文件的根節點
17             foreach (XmlNode node in nodes.ChildNodes)                          //5.遍歷根節點的子節點
18             {
19                 string name = node["name"].InnerText;                           //6.獲取XML文件節點中的內容
20                 string sex = node["sex"].InnerText;
21                 Console.WriteLine("姓名:{0},性別:{1}", name, sex);
22             }
23         }
24     }
25 }
技術分享圖片

XmlDocument對象:

    表示整個XML文檔,它使用Load方法將指定的XML文件讀入XmlDocument對象,Load方法的參數是XML文檔的路徑。

    DocumentElement屬性用於獲取根節點。

XmlNode對象:

    XmlNode對象表示一個XML中的節點。
    ChildNodes屬性用來獲取指定節點的所有子節點。

    Name屬性可以獲取當前節點的名稱。 例:<name>名字</name>獲取name。

    Inner Text屬性用來獲取當前節點的值。 例:<name>名字</name>獲取名字。

    Attributes屬性可以獲取當前節點的特性。 例:<name type="dog">名字</name> Attributes["type"]獲取dog。

    註意:ChildNodes屬性表示當前節點的所有子節點,這裏的所有子節點表示的是當前子節點的集合。

XML解析

XML文件除了給開發者看,更多的情況使用程序讀取xml文件的內容。這叫做xml解析

XML解析方式(原理不同)

DOM解析

SAX解析

XML解析工具

DOM解析原理: 1)JAXP (oracle-Sun公司官方)

2)JDOM工具(非官方)

3)Dom4J工具(非官方) 三大框架(默認讀取xml的工具就是Dom4j) ....... SAX解析原理:1)Sax解析工具(oracle-sun公司官方

什麽是DOM解析

DOM解析原理:xml解析器一次性把整個xml文檔加載進內存,
然後在內存中構建一顆Document的對象樹,通過Document對象,
得到樹上的節點對象,通過節點對象訪問(操作)到xml文檔的內容。

Dom4j工具

非官方,不在jdk中。 使用步驟: 1)導入dom4j的核心包。 dom4j-1.6.1.jar

2)編寫Dom4j讀取xml文件代碼

* 示例

    /**
     * 第一個Dom4j讀取xml文檔的例子
     * @author APPle
     *
     */
    public class Demo1 {
        public static void main(String[] args) {
            try {
                //1.創建一個xml解析器對象
                SAXReader reader = new SAXReader();
                //2.讀取xml文檔,返回Document對象
                Document doc = reader.read(new File("./src/contact.xml"));

                System.out.println(doc);
            } catch (DocumentException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }

Domj4讀取xml文件

  • 節點:
  • Iterator  Element.nodeIterator();  //獲取當前標簽節點下的所有子節點
    • 案列:
      /**
       * 得到節點信息
       */
      @Test
      public void test1() throws Exception{
          //1.讀取xml文檔,返回Document對象
          SAXReader reader = new SAXReader();
          Document doc = reader.read(new File("./src/contact.xml"));
          //2.nodeIterator: 得到當前節點下的所有子節點對象(不包含孫以下的節點)
          Iterator<Node> it = doc.nodeIterator();
          while(it.hasNext()){//判斷是否有下一個元素
              Node node = it.next();//取出元素
              //繼續取出其下面的子節點
              //只有標簽節點才有子節點
              //判斷當前節點是否是標簽節點
              if(node instanceof Element){
                  Element elem = (Element)node;
                  Iterator<Node> it2 = elem.nodeIterator();
                  while(it2.hasNext()){
                      Node n2 = it2.next();
                      System.out.println(n2.getName());
                  }
              }
          }
      }
    • 案例2:得到xml所有節點(使用遞歸)

      /**
       * 遍歷xml文檔的所有節點
       * @throws Exception
       */
      @Test
      public void test2() throws Exception{
          //1.讀取xml文檔,返回Document對象
          SAXReader reader = new SAXReader();
          Document doc = reader.read(new File("./src/contact.xml"));
          //得到根標簽
          Element rooElem = doc.getRootElement();
          getChildNodes(rooElem);
      }
      
      /**
       * 獲取 傳入的標簽下的所有子節點
       * @param elem
       */
      private void getChildNodes(Element elem){
          System.out.println(elem.getName());
          //得到子節點
          Iterator<Node> it = elem.nodeIterator();
          while(it.hasNext()){
              Node node = it.next();
              //1.判斷是否是標簽節點
              if(node instanceof Element){
                  Element el = (Element)node;
                  //遞歸
                  getChildNodes(el);
              }
          };
      }

可擴展標記語言XML(淅淅瀝瀝的小雨)