Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XSD:如何重新定义基本模式的标记_C#_Xml_Xsd - Fatal编程技术网

C# XSD:如何重新定义基本模式的标记

C# XSD:如何重新定义基本模式的标记,c#,xml,xsd,C#,Xml,Xsd,为了在C#应用程序中验证不同的XML文件,我必须处理多个XML模式。所有这些XML模式都共享一些基本元素,如果能在一个公共位置上使用这些元素,而不必每次都重新定义它们,那就太好了 我的想法是创建一个定义这些公共元素的BaseSchema.xsd文件,以及其他定义特定案例相关元素的SpecificSchema#.xsd文件。在这些SpecificSchema#.xsd模式中,我需要使用基本模式的一些元素,但也需要重新定义根标记 这是我需要的一个例子: BaseSchema.xsd Specif

为了在C#应用程序中验证不同的XML文件,我必须处理多个XML模式。所有这些XML模式都共享一些基本元素,如果能在一个公共位置上使用这些元素,而不必每次都重新定义它们,那就太好了

我的想法是创建一个定义这些公共元素的
BaseSchema.xsd
文件,以及其他定义特定案例相关元素的
SpecificSchema#.xsd
文件。在这些
SpecificSchema#.xsd
模式中,我需要使用基本模式的一些元素,但也需要重新定义根标记

这是我需要的一个例子:

BaseSchema.xsd


SpecificSchema1.xsd


SpecificSchema2.xsd


我需要验证的XML文件如下所示(它们将永不引用
BaseSchema.xsd
):


显然,这似乎是可行的(所有架构都在同一个目录中,它们都引用相同的
targetNamespace
),但当我尝试在
System.Xml.Schema.XmlSchemaSet
中加载所有架构时,会引发以下异常:

'SchemaLocation' must successfully resolve if <redefine> contains any child other than <annotation>.
我做错了什么

多谢各位

编辑:我还试图仅在
SpecificSchema#.xsd
模式中定义根标记,而不在基本模式中定义,因此不需要重新定义,但在创建读取器验证XML时出现此错误:

The global element 'http://company.com/myBaseSchema:myRootTag' has already been declared.

我修复了“SchemaLocation”必须成功解决的问题,如果它包含除以外的任何子项。仅使用schemaset中的
System.Xml.XmlUrlResolver
,以这种方式更改加载逻辑:

private XmlSchemaSet LoadSchemas()
{
var schemaSet=new XmlSchemaSet();
schemaSet.XmlResolver=new System.Xml.XmlUrlResolver();//这是我丢失的一行
foreach(目录.GetFiles(schemasDirectory)中的var schemaPath)
{
var schema=LoadSchema(schemaPath);
schemaSet.Add(schema);
}
返回模式集;
}
私有XmlSchema加载模式(字符串uri)
{
使用(var reader=XmlReader.Create(uri))
{
返回XmlSchema.Read(reader,null);
}
}
但同时加载所有模式(基本模式和所有
SpecificSchema.#.xsd
模式)给了我另一个错误:

The complexType 'http://company.com/BaseSchema:myRootTag' has already been declared.
因此,由于我确切地知道必须使用哪个
SpecificSchema#.xsd
,因此我再次更改了加载逻辑,只加载所需的一个:

private静态XmlSchemaSet LoadSchemaSet()
{
var schemaSet=new XmlSchemaSet();
schemaSet.XmlResolver=new System.Xml.XmlUrlResolver();
var schemaPath=schemasDirectory+“\\specificshema1.xsd”;
var schema=LoadSchema(schemaPath);
schemaSet.Add(schema);
返回模式集;
}

我还删除了
SpecificSchema#.xsd
模式中的
标记,但在本例中,它没有任何区别(
BaseSchema.xsd
元素的所有其他用法都可以使用它,也可以不使用它)。

您可能需要一个include语句:@jdweng我已经有
。只写XSD基文件的名称可以吗?(所有模式都在同一个文件夹中)通常将include放在根模式中以包含子模式。您的c#代码将引用根模式,子模式将使用根模式中的include来查找。@jdweng因此,在我的
BaseSchema.xsd
中,我应该为派生模式
SpecificSchema.xsd
添加include,然后将重定义保留在
SpecificSchema.xsd
中?它似乎不起作用,当我加载
SpecificSchema#.xsd
schema时,它说“重定义”元素不能出现在这个位置”。schema a由组织生成,以标准化数据传输,如Reality行业,通常在主schema中包含用户定义的类型。假设用户编辑主模式以添加新类型来代替用户定义的类型。将Include语句添加到主架构。然后为用户类型创建一个新架构。这最大限度地减少了发布新版本模式时用户需要做的更改。