Создание XML из XSD с примерами данных в c # программным способом - PullRequest
1 голос
/ 03 июня 2019

У меня есть схема XSD в локальном файле на диске.Этот XSD может быть обновлен в любое время или заменен другим.Таким образом, он динамический, и я не могу его ни схватить, ни сохранить.

Моя цель - получить список всех возможных элементов XML с их уважительными путями предков,распечатан (в консоли) Пример: Desired Console output: Html Head - Html Style - Head - Html Body - Html div - Body - Html p - div - Body - Html span - div - Body - Html strong - div - Body - Html

Примечание. Я не использую Actual Html DOM, я использую его для объяснения иерархии.

Простое решение (Я надеялся, что это сработает ...) Разобрать XSD и отфильтровать все экземпляры элементов, которые имеют name = "[anyHtmlTag]" , таким образом я могу получить список всех возможных элементов, но не путейсвоим родителям.Мой XSD использует тот, который относится к типу, который расположен где-то глубже в XSD, вот краткий пример: My XSD Example

Проблема заключается в том, что я нахожусь в Sequence , свойство "span", "p" или "strong" в этом случае не может видеть свой родительский "div".

Actual result that is not desired Html Head - Html Style - Head - Html Body - Html div - Body - Html p span strong

Причина, по которой оноЯ не могу видеть это, потому что я анализирую (в C #) схему XSD, как если бы это был документ XML.

Таким образом, я всегда ожидаю, что по мере углубления иерархии он всегда будет видеть своего предка.

Так что мой код работает довольно хорошо, пока он не достигнет ссылки Sequence в XSD и не получит элемент, но не сможет получить своих предков.

Пример кода C #

public List<string> GetAllXmlPaths(out List<ValidationResult> errors)
    {
        errors = new List<ValidationResult>();
        List<string> foundPaths = new List<string>();
        string path = @"C:\temp\XSD.xsd"; // this is dynamic
        XmlTextReader reader = new XmlTextReader(path);
        XmlSchema myschema = XmlSchema.Read(reader, ValidationCallback);
        StringWriter sw = new StringWriter();
        myschema.Write(sw);
        string XSD = sw.ToString();
        var xs = XNamespace.Get("http://www.w3.org/2001/XMLSchema");
        var doc = XDocument.Parse(XSD);
        foreach (var element in doc.Descendants(xs + "element"))
        {
            // check ancestors
            string pathToTheTop = "";                
            if (element.Ancestors(xs + "element").Any())
            {
                foreach (var p in element.Ancestors(xs + "element"))
                {
                    pathToTheTop = pathToTheTop+ "\\" + p.Attribute("name").Value;
                }
            }
            foundPaths.Add(element.Attribute("name").Value + ":" + pathToTheTop);
            Console.WriteLine(element.Attribute("name").Value + ":" + pathToTheTop);
        }
        return foundPaths;
    }

Зачем мне нужно создавать XML? На мой взгляд, до сих пор решением было бы программно создать XML с образцами данных (не имеет значениякакие данные), но он должен генерировать XML со всеми возможными путями, которые предоставляет XSD.Таким образом, будут присутствовать все предки, и я могу с легкостью проанализировать всю иерархию.

VS имеет встроенную функцию, которая позволяет щелкать правой кнопкой мыши и генерировать образец XML из XSD с помощью XMLSchemaExplorer .дополнительная информация здесь: Программно сгенерировать тестовый XML из XML-схемы Так что мне нужна точно такая же функциональность, но я делаю это программно (пока я все еще во время выполнения).

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