Возможный проверить xml против xsd использующий кода во времени выполнения?

Остерегайтесь пула потоков.NET для операций, которые могут заблокироваться для любой значительной, переменной или неизвестной части их обработки, поскольку это является склонным для поточной обработки исчерпания ресурсов. Рассмотрите использование расширений параллели.NET, которые обеспечивают большое количество логических абстракций по потоковым операциям. Они также включают новый планировщик, который должен быть улучшением на ThreadPool. См. здесь

11
задан John Saunders 31 July 2014 в 19:41
поделиться

4 ответа

Попробуйте следующее:

public void ValidateXmlDocument(
    XmlReader documentToValidate, string schemaPath)
{
    XmlSchema schema;
    using (var schemaReader = XmlReader.Create(schemaPath))
    {
        schema = XmlSchema.Read(schemaReader, ValidationEventHandler);
    }

    var schemas = new XmlSchemaSet();
    schemas.Add(schema);

    var settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.Schema;
    settings.Schemas = schemas;
    settings.ValidationFlags =
        XmlSchemaValidationFlags.ProcessIdentityConstraints |
        XmlSchemaValidationFlags.ReportValidationWarnings;
    settings.ValidationEventHandler += ValidationEventHandler;

    using (var validationReader = XmlReader.Create(documentToValidate, settings))
    {
        while (validationReader.Read())
        {
        }
    }
}

private static void ValidationEventHandler(
    object sender, ValidationEventArgs args)
{
    if (args.Severity == XmlSeverityType.Error)
    {
        throw args.Exception;
    }

    Debug.WriteLine(args.Message);
}
15
ответ дан 3 December 2019 в 04:13
поделиться

У МЕНЯ ТОЖЕ КОД! Я использую это в своих тестах:

    public static bool IsValid(XElement element, params string[] schemas)
    {
        XmlSchemaSet xsd = new XmlSchemaSet();
        XmlReader xr = null;
        foreach (string s in schemas)
        { // eh, leak 'em. 
            xr = XmlReader.Create(
                new MemoryStream(Encoding.Default.GetBytes(s)));
            xsd.Add(null, xr);
        }
        XDocument doc = new XDocument(element);
        var errored = false;
        doc.Validate(xsd, (o, e) => errored = true);
        if (errored)
            return false;

        // If this doesn't fail, there's an issue with the XSD.
        XNamespace xn = XNamespace.Get(
                      element.GetDefaultNamespace().NamespaceName);
        XElement fail = new XElement(xn + "omgwtflolj/k");
        fail.SetAttributeValue("xmlns", xn.NamespaceName);
        doc = new XDocument(fail);
        var fired = false;
        doc.Validate(xsd, (o, e) => fired = true);
        return fired;
    }

Он принимает схемы в виде строк (файловые ресурсы в сборке) и добавляет их в набор схем. Я проверяю, и если он недействителен, я возвращаю false.

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

5
ответ дан 3 December 2019 в 04:13
поделиться

Надеюсь, эта ссылка поможет:

Проверка XML с помощью XSD

2
ответ дан 3 December 2019 в 04:13
поделиться

более простое решение ..

        try
        {
            XmlReaderSettings Xsettings = new XmlReaderSettings();
            Xsettings.Schemas.Add(null, "personDivideSchema.xsd");
            Xsettings.ValidationType = ValidationType.Schema;

            XmlDocument document = new XmlDocument();
            document.Load("person.xml");

            XmlReader reader = XmlReader.Create(new StringReader(document.InnerXml), Xsettings);


            while (reader.Read());
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message.ToString());
        }
3
ответ дан 3 December 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: