Проверка XML с XSD

Используя Google Guava , вы можете использовать Splitter.fixedLength ()

Возвращает разделитель, который делит строки на куски заданной длины

Splitter.fixedLength(2).split("abcde");
// returns an iterable containing ["ab", "cd", "e"].

7
задан Peter Mortensen 31 December 2011 в 09:24
поделиться

3 ответа

Ну, во-первых, ваш XSD определяет пространство имен XML xmlns = "urn: bookstore-schema" , которого нет в вашем тестовом файле XML - следовательно, ничего в ваш тестовый XML-файл будет проверен.

Если вы удалите эти элементы из своей схемы:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:element name="title" type="xsd:string" />

, он правильно проверит ваш тестовый XML-файл и пожалуется на неправильные элементы.

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

Marc

4
ответ дан 7 December 2019 в 07:50
поделиться

Вы также можете попробовать XmlValidatingReader для проверки XML

1
ответ дан 7 December 2019 в 07:50
поделиться

Я не хочу, чтобы пользователь отправлял XML, который не определен в XSD.

Почему вас это волнует? Ваша схема проверяет узлы XML, которые находятся в вашем пространстве имен. Ваша логика обработки обрабатывает узлы XML, которые находятся в вашем пространстве имен. Узлы, не входящие в ваше пространство имен, не имеют отношения ни к вашей схеме, ни к вашей логике.

Если действительно важно ограничить все узлы в XML-документе определенным пространством имен, вы можете добиться этого, расширив базовый XmlReader логика проверки найдена здесь .

    public static void Main()
    {
        const string myNamespaceURN = "urn:my-namespace";

        XmlSchemaSet sc = new XmlSchemaSet();
        sc.Add(myNamespaceURN, "mySchema.xsd");

        XmlReaderSettings settings = new XmlReaderSettings();
        settings.ValidationType = ValidationType.Schema;
        settings.Schemas = sc;
        settings.ValidationEventHandler += ValidationCallBack;

        XmlReader reader = XmlReader.Create("myDocument.xml", settings);

        while (reader.Read())
        {
            if ((reader.NodeType == XmlNodeType.Element ||
                 reader.NodeType == XmlNodeType.Attribute)
                &&
                reader.NamespaceURI != myNamespaceURN)
            {
                LogError(reader.NamespaceURI + " is not a valid namespace.");
            }
        }
    }

    private static void ValidationCallBack(object sender, ValidationEventArgs e)
    {
        LogError(e.Message);
    }

    private static void LogError(string msg)
    {
        Console.WriteLine(msg);
    }
2
ответ дан 7 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

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