#c# #xsd
#c# #xsd
Вопрос:
Я работаю над кодом, который пытается прочитать в куче xsd-файлов и компилирует схемы в XmlSchemaSet.
Проблема в том, что эти xsd-файлы поступают из разных источников, и в них могут быть элементы / типы, объявленные несколько раз, которые я должен удалить, иначе метод компиляции XmlSchemaSet выдаст ошибку.
Есть ли рекомендуемый способ сделать что-то подобное?
Ответ №1:
Я следовал инструкциям из этого сообщения MSDN, и у меня это сработало:
Основная идея состоит в том, чтобы просмотреть типы из новой схемы и удалить их из этой схемы, если они существуют в существующей схеме.
class Program
{
static void Main(string[] args)
{
XmlSchemaSet schemaSet = MergeSchemas(@"....XMLSchema1.xsd", @"....XMLSchema2.xsd");
foreach (XmlSchema schema in schemaSet.Schemas())
{
schema.Write(Console.Out);
Console.WriteLine();
}
}
public static XmlSchemaSet MergeSchemas(string schema1, string schema2)
{
XmlSchemaSet schemaSet1 = new XmlSchemaSet();
schemaSet1.Add(null, schema1);
schemaSet1.Compile();
XmlSchemaSet schemaSet2 = new XmlSchemaSet();
schemaSet2.Add(null, schema2);
schemaSet2.Compile();
foreach (XmlSchemaElement el1 in schemaSet1.GlobalElements.Values)
{
foreach (XmlSchemaElement el2 in schemaSet2.GlobalElements.Values)
{
if (el2.QualifiedName.Equals(el1.QualifiedName))
{
((XmlSchema)el2.Parent).Items.Remove(el2);
break;
}
}
}
foreach (XmlSchema schema in schemaSet2.Schemas())
{
schemaSet2.Reprocess(schema);
}
schemaSet2.Compile();
schemaSet1.Add(schemaSet2);
return schemaSet1;
}
}
Комментарии:
1. это тот же вопрос, который задал я 🙂
2. Ха-ха, это довольно забавно. Это очень неудобный API, вся последовательность шагов по повторной обработке схемы и перекомпиляции полностью противоречит интуиции.