簡體   English   中英

使用自定義屬性擴展現有XSD架構

[英]Extend existing XSD schema with custom attribute

我需要向已通過現有的,已定義的架構驗證的xml文件中添加一些自定義屬性。

給定現有的xml元素:

<existingElement attr1="1" attr2="2" />

使用現有的xsd架構進行驗證,我希望可以在不破壞架構驗證的情況下向該元素添加自定義屬性:

<existingElement attr1="1" attr2="2" xmlns:my="http://example.com/node" my:id="myNodeId" />

我無法修改原始架構文件,並且確實包含anyAttribute元素

我應該采取什么方法?

我嘗試添加另一個xsd文件:

<xs:schema 
    targetNamespace="http://example.com/node"
    attributeFormDefault="qualified"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:attribute name="id" type="xs:string" />
</xs:schema>

但是我一直在聲明Attribute 'http://example.com/node:id' was not declared

我正在使用XmlSchemaSet.NET進行驗證,同時添加了新舊架構。

在某種程度上,您必須修改現有架構,因為您試圖創建違反其約束之一的實例文檔。

如果原始模式使用命名的復雜類型定義結構,則可以使用以下兩種機制之一修改現有的模式,而無需在文本上更改模式文檔的文本: xs:redefines ,或使用“ derivation by”定義新的復雜類型。延期”。 兩者都修改了架構而不修改架構文檔:因此,這取決於您不修改架構的要求。 請注意,如果您使用“擴展名派生”,則您的實例將必須通過包含命名擴展復雜類型的xsi:type屬性來標記其使用擴展名。

如果您對修改模式的關注是關於XSD源定義的派生,那么定義修改后的模式的另一種方法是將XSLT轉換應用於原始代碼。 實際上,這與xs:redefines非常相似,不同之處在於您可以進行任何喜歡的更改,而xs:redefined則限制了您可以更改的內容。

另一方面,如果您要確保符合新模式的文檔仍然與使用舊模式的應用程序兼容,那么所有這些機制都會失敗:在所有情況下,您都在創建不符合現有模式的文檔。模式,因此有可能破壞依賴於對該模式有效的文檔的應用程序。

的test.xml

<?xml version="1.0" encoding="utf-8"?>
<existingElement attr1="1" attr2="2" xmlns:my="http://example.com/node" my:id="myNodeId" />

test1.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="existingElement">
    <xs:complexType>
      <xs:attribute name="attr1" type="xs:unsignedByte" use="required" />
      <xs:attribute name="attr2" type="xs:unsignedByte" use="required" />
      <xs:anyAttribute />
    </xs:complexType>
  </xs:element>
</xs:schema>

test2.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://example.com/node"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:attribute name="id" type="xs:string" />
</xs:schema>

C#代碼

var schemaSet = new XmlSchemaSet();
schemaSet.Add("", "test1.xsd");
schemaSet.Add("http://example.com/node", "test2.xsd");
schemaSet.Compile();

var xml = XDocument.Load("test.xml");
xml.Validate(schemaSet, (o, e) =>
{
    Console.WriteLine(e.Severity + ": " + e.Message);
});

有用。 沒有驗證錯誤。

暫無
暫無

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

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