1. 程式人生 > >XML 中的左尖括號

XML 中的左尖括號

最近遇到了一個很棘手的問題,找了好久都沒找到原因,後來終於找到了卻令人迷惑。一個在我看來應該是XML語法錯誤的XML配置檔案卻能夠通過XML schema 的校驗。這個有語法錯誤的XML 配置檔案最終導致了整個程式的錯誤。這個檔案的片段如下:

<snapmetric name="vendor" type="string">
     aggregate type="none" groupBy="true"/>
</snapmetric>

一眼就能看到第二行其實是一個element,在"aggregate"之前應該還有一個“<”。 很明顯的一個疏忽引起的XML格式錯誤,但是這樣一個檔案在進行XML schema 校驗時卻通過了,這是怎麼回事,難道說schema校驗並不關注XML本身的格式是否正確嗎?

帶著這樣的疑問我將該XML做了修改:

<snapmetric name="vendor" type="string">
     <aggregate type="none" groupBy="true"
</snapmetric>
補上了左括號但是去掉了右括號,這次卻令人意外的報錯,說是格式錯誤。 這是怎麼回事呢?

最終在XML文件中找到了答案:

The ampersand character (&) and the left angle bracket (< may appear in their literal form only when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section. If they are needed elsewhere, they must be escaped ...

就是說在XML檔案中,使用者定義的value中“&”和“<”是絕對不允許的,那就是說">"其實是允許的,看看第一個XML片段,缺少了“<”, 

"aggregate type="none" groupBy="true"/>" 其實是被XML 當成了“snapmetric” 這個元素中的文字內容而不是子元素。這就解釋了為什麼這個XML沒有被校驗出個事錯誤的原因。那如何讓XML 不把“aggregate type="none" groupBy="true"/>“當成文字呢? 有一個辦法,哈哈。
看看我的schema定義:

<xs:element name="snapmetric">
<xs:complexType mixed="false"

>
<xs:all>
<xs:element ref="aggregate" minOccurs="0" maxOccurs="1"/>
<xs:element ref="alert" minOccurs="0" maxOccurs="1"/>
</xs:all>
<xs:attribute name="type" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="float"/>
<xs:enumeration value="integer"/>
<xs:enumeration value="string"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="name" type="xs:string" use="required">
</xs:attribute>
</xs:complexType>
</xs:element>

看到紅色字型的”mixed="false"“了嗎,它表示這個元素只包含子元素,不會包含文字,這就限制了XML把缺少左尖括號的子元素當做文字的可能。
但是如果元素本身設計成可能包含文字,那就真的沒轍了!

相關推薦

xml CDATA括號被轉義後處理辦法

xml 內容中包含轉義字元,此時需要使用CDATA包裹,<TITLE><![CDATA[KFC]]><\/TITLE> 如果接收後出現<TITLE>&

XML 中的左括號

最近遇到了一個很棘手的問題,找了好久都沒找到原因,後來終於找到了卻令人迷惑。一個在我看來應該是XML語法錯誤的XML配置檔案卻能夠通過XML schema 的校驗。這個有語法錯誤的XML 配置檔案最終導致了整個程式的錯誤。這個檔案的片段如下: <snapmetric

SQL SERVER 用for xml path自動轉義括號問題

     有時候我們的資料庫中有尖括號,然後有用到xml的時候,sql會自動的把尖括號進行轉義,但是我們不需要轉義,並且對這個有要求要用到,這時候我們可以用value的形式來實現,測試資料:--測試資料 if not object_id(N'Tempdb..#T') is n

java轉義xml中的多餘括號

xml中的敏感字元是尖括號,如果xml的值中含有尖括號,那麼在解析的時候就會報錯,如: <?xml version="1.0" encoding="UTF-8"?><books&

C語言包含頭文件時用引號和括號的區別

目錄 bsp 尖括號 編譯器 搜索路徑 當前 配置 目的 查找 用尖括號 #include <>: 一般用於包含標準的庫頭文件,編譯器會去系統配置的庫環境變量和者用戶配置的路徑去搜索,而不會在項目的當前目錄去查找 用雙引號 #include "":

保留多行文本框的換行與空格樣式,並轉義HTML標記的括號

inpu type 轉載 bmi replace rip col out 腳本 本文采用JavaScript進行演示,這並不影響你在項目中的實際應用,因為我提供的思路,你可以輕易地把它用你自己的語言進行實現,這通常是後臺語言,而且下面提供的正則表達式你幾乎可以完全照搬,因為

include包含頭文件的語句中,雙引號和括號的區別

標準庫 targe 搜索 環境 com tro 位置 區別 文件 include包含頭文件的語句中,雙引號和尖括號的區別 #include <>格式:引用標準庫頭文件,編譯器從標準庫目錄開始搜索 #incluce ""格式:引用非標準庫的頭文件,編譯器從用戶

css實現右括號樣式

height light right 分享 pre pos wid orm css .arrow{ width: 6px; height: 6px; border-top: 1px solid #999; border-right: 1px solid #

一個尖括號能幹什麽,畫一個笑臉開始(為了支持交互,它又增添了JavaScript。HTML頁面也越來越臃腫。於是CSS便誕生了。API和核心代碼的出現使HTML能夠訪問更復雜的軟件功能--支持更高級的交互和雲服務集成。這就是今天的HTML5)

重要 htm 服務 廠商 inf web運行 ima 用戶 界面 一個尖括號 < 一個尖括號能幹什麽 < ? 你可以編出一頂帽子 <(:-p 或一張笑臉 :-> 再或者更直接一些 20世紀90年代初,html作為一種簡單標記語言面

一個尖括號能幹什麼,畫一個笑臉開始(為了支援互動,它又增添了JavaScript。HTML頁面也越來越臃腫。於是CSS便誕生了。API和核心程式碼的出現使HTML能夠訪問更復雜的軟體功能--支援更高階的互動和雲服務整合。這就是今天的HTML5)

一個尖括號 < 一個尖括號能幹什麼 < ? 你可以編出一頂帽子 <(:-p 或一張笑臉 :-> 再或者更直接一些   20世紀90年代初,html作為一種簡單標記語言面世,用於在網際網路上顯示超文字。經過發展,html逐漸包含圖片和佈局設計功能。為了支援互動,

85_iOS乾貨44_#import引號和括號的區別 + xcode中黃色和藍色資料夾的區別

一,#import引號和尖括號的區別 1,#include命令 #include是C/C++的預處理指令(Preprocessor Directive),主要作用是把標頭檔案引入到任意原始檔中,在預處理階段,被包含的檔案在原始檔的指令地點進行整體替換 2,尖括號:   #includ

命令列說明中格式 括號括號的含義

[]:內的內容意思是:可寫可不寫 例如:/home下就一個list 檔案,使用ls --help中的 Usage: ls [OPTION]… [FILE]… {}:那就必須要在{}內給出的選擇裡選一個。 <>:表示必選 命令列語法字元在命令列語法中,

《Effective Java 01》--泛型List(Object), List(?)和List #括號?

## 突然發現這標題裡面的<>貌似被限制了??? 一,集合新增元素 1, 普通集合List public static void main(String[] args) { List<String> strings = new ArrayList<

CSS選擇器中的空格與括號有何區別?

例子1: .a .b {     margin: 0; } 空格隔開a和b,選擇所有後代元素。 例子2: .a>.b  {      margin: 0; } 尖括號隔開a和b,選擇所有子元素。 兩個例子的區別就在於後代和子,後代包含子子孫孫。  【空格符】white space characters

jQuery中選擇器加括號的區別

$("img")為一個get的方法,是讀取標籤為"img"元素的屬性及設定相應的屬性;$("<img/>")為一個set的方法,是建立一個新的標籤元素"img"並賦予相應標籤相應的屬性舉例:$(document).ready(function(){findDogs

【輕鬆前端之旅】​CSS選擇器中的空格與括號有何區別?

CSS選擇器中的空格與尖括號有何區別? 例子1: .a .b {     margin: 0; } 空格隔開a和b,選擇所有後代元素。 例子2: .a>.b  {      margin:

css--------div > li > a{}和div li a{}的區別(有括號和無括號

初學者,今天第一次看到css檔案中這樣的寫法:nav .primary_nav > li > a{font-size:16px;} 很奇怪li和a前邊的“>”尖括號是什麼意思,經過嘗試總結如下: html程式碼: <div class="naviga

HTML中顯示特殊字元,如括號

這幾天,做個網頁,之後進行解析,總是出錯。最後發現是因為錯誤的使用了尖括號  “<”,">"。 如下面的html程式碼: <body> 顯示:<input id="myTest" type="text" value="5&l

C++#include 採用括號和採用引號的區別

如果你還看一些別的C++教程,那麼你可能很早就發現了,有些書上的#include命令寫作#include <檔名>,但有時候又會出現#include "檔名"。你會很疑惑,到底哪個是對的呢?為什麼要有這兩種不同的寫法呢?這兩種寫法都是正確的寫法,但是它們卻是有區別的。我們知道C++已經有

保留多行文字框的換行與空格樣式,並轉義HTML標記的括號

假如在你的一個網站專案中,你需要提供一個留言入口,你用的只是普通多行文字框(textarea)進行留言內容的收集,並不喜歡使用者輸入一些HTML標記,甚至是指令碼。像下面我在douban的影評釋出一樣,如果你未加入處理,直接存入資料庫,最終在頁面輸出顯示的時候你也直接讀