簡體   English   中英

C#驗證xml

[英]C# Validation xml

我有2個xsd模式:

A.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns" xmlns:myns="myns">
  <xs:include schemaLocation="B.xsd"/>
  <xs:element name="A">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="myns:B" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

和B.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="myns">
  <xs:element name="B" type="xs:string" />
</xs:schema>

而且我有2個xml文件:

第一

<?xml version='1.0' encoding='utf-8' ?>
<A xmlns='myns'>
  <B xmlns='myns'>sdf</B>
</A>

第二

<?xml version='1.0' encoding='utf-8' ?>
<B xmlns='myns'>sdf</B>

我用此代碼驗證xml

var schemas = new XmlSchemaSet();
schemas.Add("myns", "A.xsd");
xdoc.Validate(schemas, OnValidating);

這兩個xml都是有效的,但是我需要第一個xml是有效的,第二個不是。 我怎樣才能做到這一點?

第三方提供的XSD模式,不能更改。

僅使用庫存驗證器無法解決您遇到的問題。 XSD組件分布在不同文件中的事實對於XSD驗證程序沒有任何意義。 該想法是“以統一的方式管理對來自架構文檔的架構組件的引用,無論該組件對應於來自同一架構文檔的元素信息項還是被導入”

因此,在沒有應用程序特定約束的情況下,具有一個根元素A的文檔與具有根元素B的另一個文檔的文檔將驗證該文檔,這僅僅是因為處理器可以找到這兩個元素的全局元素聲明。

您需要做的是基於一些配置信息創建一個自定義的“預驗證”步驟,該信息定義了允許的根元素列表。 如果在列表中找到文檔元素的限定名稱,則繼續進行常規驗證;否則,請繼續進行常規驗證。 否則,請從一開始就將其失敗。 以不增加應用程序運行時間開銷的方式探查文檔元素的名稱取決於獲取XML的方式,即是否涉及DOM,或者讀者和/或基礎流是否可以搜索等。

關於允許的元素列表...如果碰巧A.xsd中找到的任何全局元素被您的應用程序視為XML實例文檔中的有效文檔元素,那么您可以輕松提取允許的根元素列表通過使用.NET的SOM API遍歷A.xsd文件來限定名稱; 遍歷XmlSchema.Items以查找XmlSchemaElement類型及其QualifiedName屬性。

您可以使用字典來緩存允許的限定名稱列表,或者通過集合來緩存LINQ等。

暫無
暫無

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

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