xmldocument и вложенные схемы - PullRequest
       59

xmldocument и вложенные схемы

5 голосов
/ 10 января 2011

Использование c # и .net 3.5 Я пытаюсь проверить документ xml по схеме, которая включает в себя.

Схемы и там, как показано ниже

Schema1.xsd -> include another.xsd

another.xsd -> include base.xsd

Когда я пытаюсь добавить Schema1.xsd в XmlDocument, я получаю следующую ошибку.

Тип 'YesNoType' не объявлен или не является простым типом.

Я полагаю, что получаю эту ошибку, потому что файл base.xsd не включается при загрузке схемы Schema1.xsd.

Я пытаюсь использовать класс XmlSchemaSet, и я устанавливаю URI XmlResolver в расположение схем.

ПРИМЕЧАНИЕ. Все схемы находятся в одном каталоге E: \ Dev \ Main \ XmlSchemas

Вот код

string schemaPath = "E:\\Dev\\Main\\XmlSchemas";

XmlDocument xmlDocSchema = new XmlDocument();

XmlSchemaSet s = new XmlSchemaSet();

XmlUrlResolver resolver = new XmlUrlResolver();

Uri baseUri = new Uri(schemaPath);

resolver.ResolveUri(null, schemaPath);

s.XmlResolver = resolver;

s.Add(null, XmlReader.Create(new System.IO.StreamReader(schemaPath + "\\Schema1.xsd"), new XmlReaderSettings { ValidationType = ValidationType.Schema, XmlResolver = resolver }, new Uri(schemaPath).ToString()));


xmlDocSchema.Schemas.Add(s);

ValidationEventHandler valEventHandler = new ValidationEventHandler
(ValidateNinoDobEvent);

try
{
xmlDocSchema.LoadXml(xml);
xmlDocSchema.Validate(valEventHandler);
}
catch (XmlSchemaValidationException xmlValidationError)
{
// need to interogate the Validation Exception, for possible further 
// processing.
string message = xmlValidationError.Message;
return false;
}

Может ли кто-нибудь указать мне правильное направление относительно проверки xmldocument по схеме со вложенными включениями.

Ответы [ 2 ]

1 голос
/ 19 января 2011

У меня также есть случай с вложенной схемой, и я не вижу ошибок в проверке. Мой код выглядит следующим образом.

private string strLogger = null;
    public bool ValidateXml(string path2XMLFile, string path2XSDFile)
    {
        bool isValidFile = false;
        try
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ValidationType = ValidationType.Schema;
            settings.Schemas.Add(null, path2XSDFile);
            settings.ValidationEventHandler += new ValidationEventHandler(settings_ValidationEventHandler);
            XmlReader reader = XmlReader.Create(path2XMLFile, settings);
            while (reader.Read()) ;
            if (String.IsNullOrEmpty(strLogger))
            {
                isValidFile = true;
            }                
        }
        catch (Exception ex)
        {
            LoggingHandler.Log(ex);
        }
        return isValidFile;
    }
    private void settings_ValidationEventHandler(object sender, ValidationEventArgs e)
    {
        strLogger += System.Environment.NewLine + "Validation Error Message  = [" + e.Message + "], " + "Validation Error Severity = [" + e.Severity + "], " + System.Environment.NewLine;
    } 
0 голосов
/ 10 января 2011

Я думаю , что вам нужно объединить схемы:

http://asp.dotnetheaven.com/howto/doc/Xml/MultipleSchemas.aspx

Если они вложенные, это означает, что вам нужно начинать с нижней части иерархии и загружать их в указанном порядке. Я не уверен на 100%, потому что образцы, которые я смог найти, не имеют, строго говоря, вложенных структур, а скорее дополняют друг друга. Удачи.

...