Xml 學習

来源:http://www.cnblogs.com/nyxd/archive/2016/04/07/5362751.html
-Advertisement-
Play Games

XML概述 XML概述 XML的歷史背景 XML的歷史背景 GML(1969):通用標記語言 IBM公司的一些專家們一起研究的一個課題: 軟體必須有高度的可移植性,而且必須有一個統一的標準。為了實現軟體的一處編寫多處運行這個願景所誕生。 SGML(1985):專家們對GML升級,標準的通用標記語言。 ...


  1. XML概述

  1. XML的歷史背景

GML(1969):通用標記語言

IBM公司的一些專家們一起研究的一個課題:

軟體必須有高度的可移植性,而且必須有一個統一的標準。為了實現軟體的一處編寫多處運行這個願景所誕生。

SGML(1985):專家們對GML升級,標準的通用標記語言。SGML廣泛的應用於工業領域。

HTML(1993):由W3C組織推廣,超文本標記語言。HTM誕生願景:跨平臺,跨設備,跨瀏覽器打開同一個網頁所展示的效果是一致的。

XML(1998):由W3C組織推廣,最初誕生的目的:為了替代HTML。但是在其他方面得到了很好的發展:在數據的傳輸方面得到很好的發展。

 

面試題:什麼是XML?其主要功能是什麼?

答:XML是可拓展的標記語言,其主要功能是用於數據的傳輸和數據的存儲。

  1. 認識XML

英文全稱:extensible markup language

中文全稱:可拓展的標記語言

XML定義:XML是用於標記電子文件使其具有結構性的標記語言,可以標記數據,定義數據類型,XML是具有可拓展性的。

 

<html>

    <head></head>

    <body></body>

</html>

 

 

3、XML和HTML的差異

  • html標簽不能自定義,從標簽上不能達到"見詞知意"的目的

<ul>

    <li>華碩品質,堅若磐石</li>

</ul>

因為XML有可拓展性,所以可以自定義,所以可以在標簽命名的時候,給予有意義的名稱

<無序列表>

    <列表項>華碩品質,堅若磐石</列表項>

</無序列表>

 

 

  • html將數據與格式綁定在一起

HTML側重點是數據的表現形式。

<b>華碩品質,堅若磐石</b>

XML側重點是數據的本身。

<電腦>華碩品質,堅若磐石</電腦>

 

XML是存儲數據和描述數據結構,類比mysql。

 

  • 不同瀏覽器解html不同

主流瀏覽器:火狐,谷歌,IE,其他瀏覽器。

XML不存在相容相容問題。98%以上的瀏覽器中打開XML文檔所展示的內容是一致的。

  • html語法要求不嚴格

<ul>

    <li>無序列表

</ul>

以上代碼在HTML中可以正常運行,不會提示任何語法錯誤。

 

但是XML語法要求是很嚴格的,會提示xx行沒有閉合標簽,xx語法錯誤。

 

  1. XML的應用場景

  1. 充當程式間通訊的中間件(API)

SHOP(php)    OA(JAVA)

 

可以使用XML來實現不同編程語言之間的數據交互。

 

XML在99%的編程語言中都支持。

 

  1. 配置文件

場景:100個項目都鏈接同一個資料庫

SHOP(PHP)    OA(JAVA) ERP(C#) CRM(node.js) …100個

 

Config.php        config.jsp config.apx config.js    …

            

            Config.xml

  1. 小型資料庫

XML在一些軟體或者APP中都充當本地緩存文件。

早期:金山詞霸的本地資料庫使用的XML。

4、規範數據格式

SHOP(PHP)                            OA(JAVA)

 

解析java項目生成的XML文件                Java按照規定的格式生成XML數據

 

需求:php想java項目獲取一個人的信息

期望需求: 名稱(varchar) 年齡(int) 性別(var)

 

實際返回:    年齡int        名稱varchar性別var

所以插入資料庫的時候會報錯。。

 

 

XML可以規範約束數據的格式

 

<person>

    <Name> 1</name>

    <age>2</age>

    <sex>3</sex>

<person>

 

 

  1. XML數據傳輸原理

 

  1. XML快速入門

 

  • 描述人的信息:

<?xml version='1.0' encoding='utf-8' ?>

<person>
<name>
劉詩亮</name>
<age>26</age>
<sex>
未知</sex>
<job>
程式員</job>
</person>

 

描述書籍的信息:

<?xml version='1.0' encoding='utf-8' ?>
<book>
<title>
《三體》</title>
<autuor>
劉慈溪</autuor>
<price>99.8¥</price>
<publish>
傳智出版社</publish>
<date>2016
113</date>
</book>

 

二、XML語法

1、文檔聲明

在PHP中使用header()方法定義當前文檔的頭信息

在XML中使用文檔聲明來定義當前文檔的頭信息

 

基本語法:

<?xml version='1.0' encoding='utf-8' ?>
						

參數:version         XML的版本號                  1.0 (必填)

     Encoding        當前文檔的字元集編碼         utf-8 (必填)

     Standalone        當前文檔是否依賴月外部DTD no

2、元素(標簽,標記,節點)

元素是構成XML文檔的最基本的單位,為了識別和卻別元素,我們可以給元素給予有意義的命名:字母,數字,符號。但是,命名時必須得遵循相關的命名規範。

2.1、命名規範

  • 元素的名稱必須以下劃線和字母開頭,後面可以跟字母,數字,符號(.-_)
  • XML對大小寫銘感:<b></b> <B></B>
  • XML元素名稱中不可以出現空格符或者製表符

示例代碼:

<?xml version="1.0" encoding="UTF-8" ?>
<person>
<_123>
以下劃線開頭</_123>
<abcd>
以字母開頭</abcd>
<_a.-_>
綜合應用</_a.-_>
</person>

2.2、基本規範

  • 一個XML文檔中有且只有一個根元素
  • XML中的元素必須正確的嵌套
  • XML中的元素必須閉合(除空元素外)

 

錯誤實例:必須正確的嵌套

<?xml version="1.0" encoding="UTF-8" ?>
<person>
<name>
張某某</name><sex>未知</sex>
</person>

錯誤實例:元素標簽必須閉合

<?xml version="1.0" encoding="UTF-8" ?>
<person>
<name>
張某某
</person>

 

 

2.3、根元素

在一個XML文檔中有且只有一個根元素,根元素就是XML文檔中最外層的那個元素。

 

2.4、空元素

在HTML有一些單標簽:<br/> <hr/>

空元素:沒有內容的元素

可以寫作:<元素名稱></元素名稱>

也可以寫作:<元素名稱/>

3、屬性

<a href=``></a>

3.1命名規範:同元素的命名規範一致。

  • 屬性=的名稱必須以下劃線和字母開頭,後面可以跟字母,數字,符號(.-_)
  • XML對大小寫銘感
  • XML屬性名稱中不可以出現空格符或者製表符

示例代碼:

<?xml version="1.0" encoding="UTF-8" ?>
<person id="01" _id="02" _abc.="003" b="
我是小b" B="我的大B">老張的XML</person>

 

3.2、基本規範

  • 屬性必須在寫元素的開始標簽中
  • 在同一個XML元素中,屬性名稱不能重覆
  • XML屬性的值必須使用引號引起來(單引號和雙引號都可以)

示例代碼:

<?xml version="1.0" encoding="UTF-8" ?>
<perons say="
偶哈呦" says='偶哈呦'>我是老張</perons >

3.3、關於屬性

問題思考:屬性是用來乾什麼?

 

XML屬性也可以用來存儲數據,但是儘量不要使用屬性來存儲數據

屬性是用來描述數據的數據。

<?xml version="1.0" encoding="UTF-8" ?>
<perons say="
偶哈呦" says='偶哈呦'>
<member id="001">
張三</member>
<member id="002">
張三</member>
<member id="003">
張三</member>
<member id="004">
張三</member>
</perons

4、註釋

基本語法:

<!--我是註釋內容-->

 

註意:不可以在註釋內容中出現 --    

5、特殊字元

在XML中存儲的數據會有一些XML敏感的符號,我們可以通過轉義字元實現替換。

在XML中提供了5中轉義字元

 

&lt;

&gt;

&amp;

&apos;

&quot;

 

6、CDATA區段

在XML提供了大批量特殊字元存儲的方案。

示例代碼:

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

<code>
<![CDATA[

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DTD
校驗器</title>
<script>
//1
、實例化DTD對象
var M = new ActiveXObject('Microsoft.XMLDOM');
//2
、開啟DTD校驗
M.validateOnParse = true;
//3
、關閉非同步
M.async = false;
//4
、載入XML文檔
M.load('entity.xml');
//5
、配置調試信息
document.write('
錯誤信息:'+ M.parseError.reason);
document.write('<hr/>');
document.write('
錯誤行數:'+ M.parseError.line);
</script>


</head>
<body>

</body>
</html>
]]>


</code>

 

 

7、處理指令

作用:用來指揮軟體如何解析XML文檔。

語法:必須以"<?"作為開頭,以"?>"作為結尾。

常用處理指令:

        xml指令

        xml-stylesheet指令

例: <?xml-stylesheet type="text/css" href="style.css"?>

 

運行效果:

 

代碼太多:見

8、中文命名XML

只有支持中文的字元集才可以使用中文命名的XML文檔。

譬如常用的:utf-8

實例代碼:以下字元集不支持XML中使用中文

<?xml version="1.0" encoding="shift_jis" ?>
<
英雄聯盟>
<
英雄 id="坦克">德瑪西亞.蓋倫</英雄>
<
英雄 id="ADC">千珏</英雄>
<
英雄 id="ADC">大嘴</英雄>
</
英雄聯盟>

 

三、DTD語法

1、基本概念

  • DTD是:文檔類型約束
  • DTD是用來約束XML文檔的。
  • 凡是被DTD所約束的XML文檔,其元素,元素的組織方式,元素所包含的內容,元素的屬性都必須符合DTD所定義的規則。
  • DTD所定義的規則:是由開發者自定義。

 

兩個凡是:

  • 凡是滿足了XML語法規範的XML文檔,我們將其稱之為:結構良好的XML文檔
  • 凡是滿足了DTD規則的XML文檔,我們將其稱之為:有效的XML文檔。

 

關係:有效和結構良好的XML文檔有什麼關係?

  • 結構良好的XML文檔不一定是有效的XML文檔
  • 有效的XML文檔一定是結構良好的XML

 

一張圖看懂兩者關係:

s

 

 

 

 

 

 

 

2DTD結構

一個完整的DTD包含以下幾點:

 

  • DTD聲明
  • 元素聲明
  • 屬性聲明
  • 實體聲明

3DTD聲明

通過DTD所編寫的位置的不同,將其分為內部DTD和外部DTD

 

3.1、內部DTD

基本語法:

<!DOCTYPE 根元素[

    

]>

<!DOCTYPE person[
<!--
編寫相關的DTD語法-->
]>

 

 

3.2、外部DTD

<!DOCTYPE 根元素 SYSTEM `外部DTD文檔的路徑`>

  1. DTD校驗器

作用:是引來校驗XML文檔是否符合DTD所定義的規則。

 

DTD校驗器只支持IE瀏覽器,因為ActiveXObject對象只有在IE瀏覽器中存在,所以我們在調試的時候,通過IE瀏覽器調試。

 

4.1、創建DTD校驗器五步走

    <script>
//1
、實例化DTD校驗器
var M = new ActiveXObject('Microsoft.XMLDOM');
//2
、開啟DTD校驗器
M.validateOnParse = true;
//3
、關閉非同步
M.async =false;
//4
、載入XML文檔
M.load('demo02.xml');
//5
、配置調試信息
document.write('錯誤信息:'+ M.parseError.reason);
document.write('<hr/>');
document.write('
錯誤行數:'+ M.parseError.line);
</script>

 

  1. 元素聲明

5.1、格式聲明

基本格式:

<!ELEMENT 元素名稱 元素類型>

實例代碼:

<!DOCTYPE person[
<!ELEMENT person (#PCDATA)>
]>

 

52、內容聲明(屬性類型)

  • (#PCDATA)    被聲明的元素的內容必須為字元串
  • ANY            被聲明的元素的內容可以是子元素可以是字元串
  • EMPTY        被聲明的元素的內容必須為空。

 

示例代碼:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person[
<!ELEMENT person ANY>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age EMPTY>
]>
<person>
<name>
偶哈呦</name>
<age></age>
</person>

 

 

5.3、子元素聲明

  • (元素1,元素2,元素3,…..,元素n) 被聲明元素必須按照這樣的順序出場
  • (元素1|元素2|元素3|…元素n) 被聲明的元素必須出現其中一個

示例代碼:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person[
<!ELEMENT person (name,age,sex)>
<!ELEMENT name (name1|name2|name3)>
<!ELEMENT age ANY>
<!ELEMENT sex ANY>
<!ELEMENT name1 ANY>
<!ELEMENT name2 ANY>
<!ELEMENT name3 ANY>
]>
<person>
<name>
<name3></name3>
</name>
<age></age>
<sex></sex>
</person>

 

5.4、混合聲明

實例代碼:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person[
<!ELEMENT person (name,age,(sex|job|address))>
<!ELEMENT name ANY>
<!ELEMENT age ANY>
<!ELEMENT sex ANY>
<!ELEMENT job ANY>
<!ELEMENT address ANY>

]>

<person>
<name></name>
<age></age>
<address></address>
</person>

 

3.5、修飾符

*    被聲明的元素可以出現0次或者多次(隨意)

?    被聲明的元素可以出現1次或者0次(最多一次)

+ 被聲明的元素可以出現1次或者多次(最少一次)

 

示例代碼:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person[
<!ELEMENT person (name?,age*,sex+,job)>
<!ELEMENT name ANY>
<!ELEMENT age ANY>
<!ELEMENT sex ANY>
<!ELEMENT job ANY>
<!ELEMENT address ANY>
]>
<person>
<name></name>
<age></age>
<age></age>
<sex></sex>
<job></job>
</person>

  1. 屬性聲明

6.1、格式聲明

<!ATTLIST 元素名稱 屬性名稱 屬性類型 預設值>

6.2屬性類型(內容聲明)

  • CDATA                被聲明的屬性的值可以是字元串
  • ID                    被聲明的屬性的值在整個文檔中必須唯一,且屬性的值必須符合XML命名規範。
  • (值1|值2|值3|值4) 枚舉,被聲明的屬性的值必須為其中一個。

實例代碼:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person[
<!ELEMENT person (name,sex)*>
<!ATTLIST person id CDATA #REQUIRED>
<!ELEMENT name ANY>
<!ATTLIST name id ID #REQUIRED>
<!ATTLIST name id ID #REQUIRED>
<!ELEMENT age ANY>
<!ELEMENT sex ANY>
<!ATTLIST sex var (
||未知) #REQUIRED>
]>
<person id="001" >
<name id="a02"></name>
<sex var="
未知"></sex>
</person>

 

6.3、預設值

  • #REQUIRED        被聲明的屬性必須包含
  • #IMPLIED        可有可無
  • #FIXED `固定值`    值必須為固定的

 

示例代碼:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person[
<!ELEMENT person (name,age,sex)>
<!ELEMENT name ANY>
<!ATTLIST name daming CDATA #IMPLIED>
<!ATTLIST name xiaoming CDATA #REQUIRED>
<!ELEMENT age ANY>
<!ATTLIST age number CDATA #FIXED '18'>
<!ELEMENT sex ANY>
]>
<person>
<name daming="
我是大明" xiaoming="我的小明"></name>
<age number="18"></age>
<sex></sex>
</person>

 

7、實體

7.1、引用實體

&lt;

&gt;

&amp;

&apos;

&quot;

 

 

基本語法:

<!ENTITY 實體名稱 `實體值`>

 

實例代碼:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person[
<!ELEMENT person ANY>
<!ENTITY name "
偶哈呦">
<!ENTITY school "
傳智播客">
<!ENTITY teacher "
張某某">
<!ENTITY class "PHP
十五期">
]>
<person>
我是來自於 &school;&class;&teacher;
</person>

 

7.2、參數實體:

參數實體用於DTD內部。

參數實體只能在外部DTD中定義。

 

 

基本語法:

<!ENTITY % 實體名稱 `實體值`>

使用方法:

%實體名稱;

 

示例代碼:waibu.DTD

<!ELEMENT person (name)>
<!ENTITY
% type "(#PCDATA)">
<!ELEMENT name %type;>
<!ENTITY name "
偶哈呦">
<!ENTITY school "
傳智播客">
<!ENTITY teacher "
張某某">
<!ENTITY class "PHP
十五期
">

實例代碼:demo_17_canshushiti.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE person SYSTEM "waibu.DTD">
<person>
<name>
啦啦啦啦

</name>
</person>

 

運行效果:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 建議13、為類型輸出格式化字元串 建議14、正確實現淺拷貝和深拷貝 建議15、使用dynamic來簡化反射實現 建議13、為類型輸出格式化字元串 有兩種方法可以為類型提供格式化的字元串輸出。 一種是意識到類型會產生格式化字元串輸出,於是讓類型繼承介面IFormattable。這對類型來說,是一 ...
  • JQuery UI 是以 JQuery 為基礎的開源 JavaScript 網頁用戶界面代碼庫。包含底層用戶交互、動畫、特效和可更換主題的可視控制項,這些控制項主要包括:Accordion,Autocomplete,ColorPicker,Dialog,Slider,Tabs,DatePicker,Ma ...
  • 查找了msdn上關於bool的介紹,整理如下: bool 關鍵字是 System.Boolean 的別名。它用於聲明變數來存儲布爾值 true 和 false。 如果需要一個也可以有 null 值的布爾型變數,請使用 bool?。 bool 變數的預設值為 false。bool? 變數的預設值為 n ...
  • ...
  • ...
  • 在採用了依賴註入的應用中,我們總是直接利用DI容器直接獲取所需的服務實例,換句話說,DI容器起到了一個服務提供者的角色,它能夠根據我們提供的服務描述信息提供一個可用的服務對象。ASP.NET Core中的DI容器體現為一個實現了IServiceProvider介面的對象。 一、ServiceProv... ...
  • HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服務端組件、客戶端組件和 Agent 組件,廣泛適用於各種不同應用場景的 TCP/UDP 通信系統,提供 C/C++、C#、Delphi、E(易語言)、Java、Python 等編程語言介面。HP-Socket 對通信層實現完全封 ...
  • 前兩天給同事做 code review,感覺自己對 Java 的 Generics 掌握得不夠好,便拿出 《Effective Java》1 這本書再看看相關的章節。在 Item 24:Eliminate unchecked warnings 這一節中,作者拿 ArrayList 類中的 publi ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...