[英]General XSD to check if XML is well-formed?
我們有一個導入XML文件的系統,根據xsd進行檢查然后進行處理。
現在我們有一個案例,我們希望以這種方式傳輸任何對象。 即Java對象被序列化為XML,稍后導入,對xsd進行檢查並進行處理。
由於我們事先不知道對象的確切外觀,我們希望使用非常通用的xsd,並且只檢查XML格式是否完好,但不是特定節點左右。
我嘗試找到這樣一般的XSD,但我發現的只是網站會為你檢查成型,而我需要一個xsd進行類似的檢查。
有誰知道這樣的XSD? 或者我該如何創建它。 理想情況下會說:
“XML有一個標題和一個數據區域。標題區域是結構化內容,我知道如何描述該部分。數據區域可以是任何東西。我不關心它是什么,我只是接受它,如果它是XML。”
如果我找不到接受這種非特定內容的xsd,我會恢復在這種情況下跳過xsd驗證,但這將是一個尷尬的解決方案,因為我必須改變一個完善的一般導入功能,我希望我不要需要觸摸。
是的,您可以使用XSD驗證器檢查格式良好或僅僅是文檔的一部分的有效性。
正如其他人所指出的那樣,如果你真的只想檢查結構良好,那么根本不需要XSD驗證步驟。
但是它說這里說你不能使用XSD驗證步驟來檢查格式良好是錯誤的:你需要的只是一個基本上空的模式和一個你可以在'寬松驗證'模式下調用的驗證器(它實質上驗證了元素和匹配聲明的屬性 - 在空的模式中,將找不到任何聲明。 因為任何普通的XSD驗證器都會解析XML,如果你把它交給XML(而不是DOM對象),那么良好的格式就會被檢查為副作用。 (這是可能的爭論,當然,在這種情況下,良好檢查是不是真正的XSD驗證過程,只是一個必要的伴奏,這我是誰享受這種詭辯的人當中的一部分 ,但是我沒有你關心這種區別的印象。)
但實際上你說你知道如何描述(因此,我想,驗證)標題區域,它只是應該不受約束的有效負載區域。 為此,您需要大致以下形式的架構。 它與asmith1024提供的草圖在基本思想上非常相似,除了該模式對其objects
元素使用顯式通配符,而這個只依賴於xs的默認類型:anyType; 一個結果是這個tns:payload
元素將接受字符數據作為內容,而objects
元素則不接受。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://example.com/nss/target"
xmlns:tns="http://example.com/nss/target">
<!--* a message contains a header and
* a payload. *-->
<xs:complexType name="message">
<xs:sequence>
<xs:element ref="tns:header"/>
<xs:element ref="tns:payload"/>
</xs:sequence>
</xs:complexType>
<xs:element name="message" type="tns:message"/>
<!--* a header has a defined structure
* (to be specified ...) *-->
<xs:element name="header">
<!--* ... your definition of header
* validity here ... *-->
</xs:element>
<!--* other types and elements used in
* header ... *-->
<!--* A payload has NO defined structure. *-->
<!--* no definition of any type for payload,
* so it defaults to xs:anyType, and
* can contain ... any well-formed XML
* content. *-->
<xs:element name="payload"/>
你可以嘗試這樣的事情:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://test.any.org"
xmlns="http://test.any.org"
elementFormDefault="qualified">
<xs:element name="objects">
<xs:complexType nillable="true">
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
您對此所說的是,如果任何格式良好的XML包含在{ http://test.any.org }對象元素中,則它是有效的。
這將處理一個空列表:
<objects xmlns="http://test.any.org"/>
空列表:
<objects xmlns="http://test.any.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
以及來自任何命名空間(或無)的異構對象列表:
<any:objects
xmlns:any="http://test.any.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<objectA type="someType" value="someValue"/>
<objectB xmlns="http://some.external.schema" xsi:nil="true"/>
<any2:objectC
xmlns:any2="http://another.external.schema"
xmlns:any3="http://some.funky.attribute">
<any2:type any3:attr1="hello">Some Type</any2:type>
<any2:value any3:attr2="whoops">Some Value</any2:value>
</any2:objectC>
</any:objects>
當然,如果您收到一個沒有對象元素作為其根目錄的文檔,您將不得不首先將其包含在一個文檔中。
不,你不能這樣做。 驗證XML解析器需要將輸入XML文檔的根元素與模式中的元素聲明進行匹配。 如果無法做到這一點,那么vaildation當然會失敗。
但是沒有什么可以阻止你根據模式驗證已知內容,只檢查未完成內容的“良好格式”。
XSD無法檢查XML是否格式正確 。 XSD只能用於檢查XML是否有效 。 任何XML解析器都將報告XML文檔是否格式正確; 不需要XSD。
有關格式良好和有效之間的區別,請參閱格式良好與有效XML 。
對於非常通用的XSD,請參閱允許任何內容的XML Schema(xsd:any) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.