簡體   English   中英

一般XSD檢查XML是否格式正確?

[英]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)


* ...除非你有辦法創建一個空的XSD並在松弛模式下調用驗證

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM