簡體   English   中英

使用XML命名空間針對C#中的架構創建和驗證XML

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

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