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