XML可擴展的標記語言

XML

可擴展的標記語言
標記:標籤

<name>張三</name>

xml是一種文件格式

xml文件的用處:
作爲程序的配置文件使用的
配置文件:保存一些程序需要的固定的信息
xml文件內容是給程序看的

Xml語法:

處理指令:
XML建議在文件最開始使用一個處理指令:

<?xml version=”1.0” encoding=”UTF-8”?>

標記(標籤)tag:
標記語法:

  <開始標籤></結束標籤>
      <自結束標籤/>
          如果標籤中間沒有內容,此時可以採用自結束標籤

注意點:
1. 嚴格區分大小寫
2. 標籤要結束
3. 標籤可以嵌套使用
註釋:

     <! -- 註釋內容 -- >

元素 Element:一對標籤
遵循原則:
    xml文件中必須也只能有一個根元素,可以在此根元素下定義多個子元素
    練習:
定義xml文件,在此文件中定義多個Student信息

<?xml version="1.0" encoding="UTF-8"?>
<!-- 根標籤/根元素 -->
<personList>
   <!-- 子標籤 -->
   <person>
      <id>1</id>
      <name>tom</name>
      <age>23</age>
   </person>
   <person>
      <id>2</id>
      <name>jack</name>
      <age>33</age>
   </person>

</personList>

屬性Attribute
1. 屬性是定義在開頭標籤中的,一個標籤中可以定義多個屬性,多個屬性是無序的
2. 屬性的屬性值必須用引號引起來(可以是”“,也可以是”)
3. 一些唯一的值通常都會定義出屬性
4. Student對象:
javaBean類:成員變量:id name age gender
xml寫法:

     <student id="1" name="tom" age="23" gender="女/>  

實體替換(轉義)
在xml中,如果要使用一些具有特定意義的字符的本意,此時就需要使用實體替換(轉義)
常見的轉義字符:
< <

&gt;    >
&amp;    &
&apos;   ‘
&quot;   “

CDATA段:
對於大量的文本,這些本文出現了大量的特殊字符,此時若想將這些字符作爲本意輸出,可以不使用實體替換,可以利用CDATA包裹起來,這樣就可以不用轉義了.
格式:

<![CDATA[文本內容]]>
<?xml version="1.0" encoding="UTF-8"?>
<list>
   <student>
      <name>tom</name>
      <age>23</age>
      <desc>
          <![CDATA[此學生的年齡<學生平均年齡,
          '性格'很溫和,成績&等級偏上]]>
      </desc>
   </student>

</list>

XML API

標準的 W3C SAX DOM API非常難以使用,開源社區提供了Dom4j API 非常簡便易用,已經成爲XML處理的標準
DOM(document)樹
xmlDOM文件:
根元素
-子元素
-子元素
-子元素

對XML使用DOM4j API進行操作,必須先導入dom4j的jar包

  1. 寫XML
    i. 步驟:
    a) 創建DOM樹
    b) 調用XMLWriter輸出流將domcument對象寫入文件
    i. 注意點:格式文件:使用OutputFormat
/**
 * 創建student.xml文件並向文件中寫入dom樹數據
 * 步驟:
 *     1.創建Dom樹
 *     2.使用XMLWriter對象將docuemnt對象寫入文件
          注意:格式問題:使用OutputFormat
 * @author adminitartor
 *
 */
public class WriteXmlDemo {
   public static void main(String[] args) throws IOException {
      //創建DOM樹
      Document dom = DocumentHelper.createDocument();
      //添加根元素
      Element root = dom.addElement("list");
      //在根元素添加student子元素
      Element student = root.addElement("student");
      //在student標籤上添加id屬性
      student.addAttribute("id", "1001");
      //添加子標籤
      Element name = student.addElement("name");
      //向標籤中添加內容
      name.addText("tom");
      //添加age子標籤
      Element age  = student.addElement("age");
      //給age標籤中間添加內容
      age.addText("23");

      System.out.println(dom.asXML());

      //用輸出流向文件中寫入數據
      FileOutputStream fos = new
             FileOutputStream("student.xml");
      //創建OutputFormat類對象
      OutputFormat format = OutputFormat.createPrettyPrint();
      XMLWriter writer = new
             XMLWriter(fos, format);
      writer.write(dom);
      writer.close();
   }

}

運行結果如下

這裏寫圖片描述

方法:
添加元素:addElement(String name)
向標籤中添加文本:addText(String content)
添加屬性以及屬性值:addAttribute(String name,String value)

a) 練習:
現從數據庫查詢出了學生列表(保存在集合中),現要求將查詢出的所有學生信息寫入student.xml中
1. 定義Student類
2. 測試類中:
a) 創建集合
b) 將集合中的student數據寫入xml文件

/**
 * 將一個集合中的所有student對象的信息寫入
 * xml文件
 * @author adminitartor
 *
 */
public class WriteXmlDemo02 {
   public static void main(String[] args) throws IOException {
      //創建集合用於保存多個Student對象
      List<Student> list = new ArrayList<>();
      for(int i=1;i<=5;i++){
          Student student = new Student(i, "學生"+i, 23+i, 90.5+i);
          list.add(student);
      }
      //創建studentlist.xml並向文件中寫入數據
      //創建DOM樹
      Document doc = DocumentHelper.createDocument();
      //創建標籤元素
      Element root = doc.addElement("studentList");

      for (Student stu : list) {
          Element student = root.addElement("student");
          //創建屬性
          student.addAttribute("id", stu.getId().toString());
          //創建子標籤
          Element name = student.addElement("name");
          //在name標籤中添加內容
          name.addText(stu.getName());
          Element age = student.addElement("age");
          age.addText(stu.getAge().toString());
          Element score = student.addElement("score");
          score.addText(stu.getScore().toString());
      }

      //向文件中寫入Document對象
      FileOutputStream fos =
             new FileOutputStream("studentList.xml");
      OutputFormat format = OutputFormat.createPrettyPrint();
      XMLWriter writer = new XMLWriter(fos, format);
      writer.write(doc);

      writer.close();
   }

}

定義 Student類 如下
注意Student中的屬性定義的類型,包裝類,爲什麼麼?
這裏寫圖片描述

運行結果

這裏寫圖片描述

2. 解析xml

寫XML步驟:
1. 寫出Document對象
2. 通過流將此對象寫入文件
解析XML步驟:
1. 通過輸入流來讀取xml文件的內容 - Document對象
2. 通過docuement對象獲取dom樹中的標籤元素-Element對象
3. 從Element對象中獲取標籤元素中的屬性值,文本內容

方法:
getRootElement(); - 獲取根元素
elements() - List
獲取指定元素下的所有子元素
element(String name) - Element
獲取指定元素下指定名稱的子元素
elements(String name)-List
獲取指定元素下指定名稱的所有子元素
getText() :String
獲取元素中間的文本內容
elementText(String name)
獲取指定元素中間的文本內容
attribute(String name ) :Attribute:
獲取指定名稱的屬性對象
getValue() :String :獲取屬性值
attributeValue(String name) – String :
獲取指定名稱的屬性的屬性值

案例:

   讀取studentList.xml文件中的所有學生信息,將讀取到的信息封裝到Student對象中保存入集合,最後遍歷集合。
   分析:熟悉SAXReader 裏邊的方法,獲取根元素,子元素,元素的屬性及屬性值,元素中間的文本內容

public static void main(String[] args) throws FileNotFoundException, DocumentException {
      //通過輸入流對象讀取xml文件的內容得到Document對象
      FileInputStream fis = new
             FileInputStream("studentList.xml");
      SAXReader reader = new SAXReader();
      Document doc = reader.read(fis);
      //獲取document對象下的根標籤
      Element root = doc.getRootElement();
      //得到所有的student標籤
      List<Element> list = root.elements("student");
      //創建集合保存Student對象
      List<Student> studentList = new ArrayList<>();

      //對list集合進行遍歷,對遍歷到的標籤對象進行解析
      for (Element ele : list) {
          //獲取此元素的屬性值
//        Attribute attribute = ele.attribute("id");
//        //獲取此屬性對象的屬性值
//        String id = attribute.getValue();
          //等同於以上兩行代碼的作用
          int id = Integer.parseInt(ele.attributeValue("id"));
         //獲取此元素下所有的子元素的文本內容
          Element name = ele.element("name");
          //獲取此標籤中間的文本內容
          String nameVal = name.getText();
          //等同於以上兩行代碼的作用
//        String nameVal = ele.elementText("name");
          //獲取子標籤age,score中間的文本內容
          int age = Integer.parseInt(ele.elementText("age"));
          double score = Double.parseDouble(ele.elementText("score"));
          //創建Student對象並存入集合
          Student student = new Student(id, nameVal, age, score);
          studentList.add(student);
      }

      //遍歷保存Student對象的集合
      for (Student student : studentList) {
          System.out.println(student);
      }

   }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章