У меня есть схема 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, вот краткий пример:
Проблема заключается в том, что я нахожусь в 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-схемы Так что мне нужна точно такая же функциональность, но я делаю это программно (пока я все еще во время выполнения).