[英]Create and Validate XML against a schema in C# using XML Namespaces
我試圖弄清楚如何針對C#中的模式驗證XML。 如果XML很簡單,並且不使用任何命名空間元素,那么一切似乎都很棒。 但是,如果它使用XML名稱空間,我就會遇到問題。
我要生成的XML是:
<?xml version="1.0" encoding="utf-8"?>
<SlideDeck xmlns:xy="http://something.com" xy:type="SlideDefinitions">
<Slide>...</Slide>
<Slide>...</Slide>
...
</SlideDeck>
我可以用等效於C#的形式生成此代碼:
XmlDocument xDoc = new XmlDocument();
XmlElement xSlideDeck = xDoc.CreateElement("SlideDeck");
xDoc.AppendChild(xSlideDeck);
xSlideDeck.SetAttribute("xmlns:xy", "http://something.com");
xSlideDeck.SetAttribute("type", "http://something.com", "SlideDefinitions");
我可以嘗試通過以下方式驗證產生的XML文檔:
xDoc.Schemas.Add("", "Schema.xsd");
xDoc.Validate(Handler);
驗證的Schema.xsd文件現在非常簡單:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="SlideDeck">
<xs:complexType>
<xs:sequence>
<xs:choice maxOccurs="unbounded">
<xs:element ref="Slide"/>
</xs:choice>
</xs:sequence>
<xs:attribute name="type" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
... Slide Defined Here ...
</xs:schema>
運行驗證時,出現以下錯誤:
The 'http://something.com:type' attribute is not declared.
The required attribute 'type' is missing.
我還嘗試過向具有相同模式文件引用http://something.com的XmlDocument添加一個附加模式(希望它可以將其用於“ xy”命名空間)。 我也嘗試過將一個模式僅添加到適當的uri(不帶uri的模式中刪除),但是根據其他設置,沒有任何內容得到驗證。 我嘗試使根“ SlideDeck”元素也屬於http://something.com命名空間。
知道這里可能會發生什么嗎? 我根本無法更改XML文檔的格式。 我可以將'SlideDeck'元素與所有其他元素一起添加為'xy'前綴,但我不希望不必修改所有代碼,而是將uri添加到名稱空間和前綴中,以實現此目的。 最大的症結是xmlns:xy定義和xy:type屬性,它們提醒接收者期望的內容。 其他更改是合理的。 我也可以控制程序驗證所針對的XSD,如果最好通過在此進行更改來創建和驗證該程序。
您的架構表示SlideDeck
元素必須具有type
屬性-都在null命名空間中,而在XML中, SlideDeck
元素在http://something.com
命名空間中具有屬性type
-因此會出現錯誤。
您應該將XML更改為:
<SlideDeck type="SlideDefinitions">
<Slide>. . . </Slide>
<Slide>. . . </Slide>
. . .
</SlideDeck>
(即擺脫名稱空間)。
或者,您必須更改架構,將其分為兩個部分:
typeAttr.xsd:
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xy="http://something.com"
xmlns="http://something.com"
targetNamespace="http://something.com"
elementFormDefault="qualified"
attributeFormDefault="qualified" >
<xs:attribute name="type" type="xs:string" />
</xs:schema>
slide.xsd:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xy="http://something.com">
<xs:import namespace="http://something.com" schemaLocation="typeAttr.xsd"/>
<xs:element name="SlideDeck">
<xs:complexType>
<xs:sequence>
<xs:choice maxOccurs="unbounded">
<xs:element ref="Slide"/>
</xs:choice>
</xs:sequence>
<xs:attribute ref="xy:type" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="Slide"></xs:element>
</xs:schema>
(在同一目錄中)。
這樣,您可以在其單獨的命名空間中定義type
屬性,並且原始XML可以正確驗證。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.