Как проверить XML с помощью XSD с помощью LINQ - PullRequest
0 голосов
/ 22 июля 2011

EDIT2: проблема, кажется, мой xsd. он проверяет почти каждый XML. Я не могу опубликовать здесь XSD. почему каждый XML будет действительным для XSD?

РЕДАКТИРОВАТЬ: нашел аналогичный пример в ответе на здесь . Та же проблема, он не находит ошибок, независимо от того, что я сравниваю xml и xsd. даже если я использую случайный diffrent xsd, он все время говорит, что все в порядке.

Я нашел много примеров того, как это делается без LINQ, но как бы вы сделали это с LINQ?

Я использовал Google, чтобы найти пример, но, похоже, большую часть времени пропускает проверку каждого XML. (однажды он вошел в него, отклонив файл, но я не смог его воспроизвести.)

Есть ли лучшие способы сделать это или есть причина, по которой он пропустит проверку?

public String ValidateXml2(String xml, String xsd)
    {
        String Message = String.Empty;

        var ms = new MemoryStream(Encoding.Default.GetBytes(xml));

        // Create the XML document to validate against.
        XDocument xDoc = XDocument.Load(ms, LoadOptions.PreserveWhitespace);
        XmlSchemaSet schema = new XmlSchemaSet();

        bool isError = new bool();  // Defaults to false.
        int countError = 1;         // Counts the number of errors have generated.
        Stream xsdMemoryStream = new MemoryStream(Encoding.Default.GetBytes(xsd));

        // Add the schema file you want to validate against.
        schema.Add(XmlSchema.Read
                (xsdMemoryStream,
                    new ValidationEventHandler((sender, args) =>
                    {
                        Message = args.Exception.Message;
                    })
                ));

        // Call validate and use a LAMBDA Expression as extended method!
        // Don't you love .NET 3.5 and LINQ...
        xDoc.Validate(schema, (sender, e) =>
        {
            switch (e.Severity)
            {
                case XmlSeverityType.Error:
                    Console.WriteLine("Error {0} generated.", countError);
                    break;
                case XmlSeverityType.Warning:
                    Console.WriteLine("Warning {0} generated.", countError);
                    break;
            }
            Console.WriteLine(sender.GetType().Name);
            Console.WriteLine("\r\n{0}\r\nType {1}\r\n", e.Message,
                                                         e.Severity.ToString());

            Console.WriteLine("-".PadRight(110, '-'));
            countError++;
            isError = true; // If error fires, flag it to handle once call is complete.
        }
          , true); // True tells the validate call to populate the post-schema-validation
        // which you will need later, if you want to dive a littel deeper...

        if (isError == true) // Error has been flagged.  Lets see the errors generated.
            Console.WriteLine("You my friend have {0} error(s), now what?", countError);
        else
            Console.WriteLine("You rock! No errors...");

        Console.Write("\r\n\r\nPress Enter to End");
        Console.ReadKey();


        return Message;
    }

Кредиты и оригинальный пример

1 Ответ

1 голос
/ 29 декабря 2011

Очевидно, что при использовании LINQ to XML необходимо, чтобы схемы targetNamespace соответствовали пространству имен проверяемого xml, поскольку метод validate просматривает коллекцию схем для одной проверки этого пространства имен документов.Если такой файл не найден, документ проверяется.

проверьте эту ссылку для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...