我需要向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
。
我正在使用.NET
在XmlSchemaSet
中进行验证,同时添加了旧模式和新模式。
答案 0 :(得分:1)
在某种程度上,您必须修改现有架构,因为您试图创建违反其约束之一的实例文档。
如果原始模式使用命名的复杂类型定义结构,则可以使用以下两种机制之一来修改现有模式,而无需对模式文档的文本进行文本更改:xs:redefines
或定义新的复杂结构使用“扩展衍生”进行输入。两者都修改了架构而不修改架构文档:因此,这取决于您不修改架构的要求。请注意,如果您使用“按扩展名派生”,则您的实例将必须通过包含命名扩展复杂类型的xsi:type
属性来标记它使用扩展名。
如果您对修改模式的关注是关于XSD源定义的派生,那么定义修改后的模式的另一种方法是将XSLT转换应用于原始代码。实际上,它与xs:redefines非常相似,不同之处在于您可以进行自己喜欢的任何更改,而xs:redefined则限制了您可以更改的内容。
另一方面,如果您要确保符合新模式的文档仍然与使用旧模式的应用程序兼容,则所有这些机制都将失败:在所有情况下,您正在创建不符合标准的文档。到现有架构,因此有可能破坏依赖于针对该架构有效的文档的应用程序。
答案 1 :(得分:0)
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);
});
有效。没有验证错误。