У меня есть некоторые xml-файлы, в которых могут быть некоторые элементы с именем list
, которые имеют атрибут list-type
с 3 возможными значениями: упорядоченный, маркированный и простой .Теперь
1) для list-type="ordered"
, за каждым элементом list-item
должен следовать элемент label
, а значение label
не должно начинаться с & # x
2) для list-type="bullet"
, за каждым элементом list-item
должен следовать элемент label
, а значение label
должно начинаться с & #x
3) для list-type="simple"
, каждый элемент list-item
не должен сопровождаться элементом label
(простой список не имеет меток)
Я пытаюсь проверить, есть ли в файле list-item
, которые не следуют приведенным выше правилам, основываясь на его непосредственном родительском элементе list
Я пробовал
string path=@"C:\temp\list.xml";
XDocument doc=XDocument.Load(path,LoadOptions.SetLineInfo);
var simplelists=doc.Descendants("list").Where(x=>x.Attribute("list-type").Value=="simple");
if (simplelists!=null)
{
foreach (var list in simplelists)
{
var x=list.Descendants("list-item").Where(a=>a.Elements("label").Any()).Select(a=>((IXmlLineInfo)a).LineNumber);
if (x!=null)
{
foreach (var element in x)
{
Console.WriteLine("Check line: "+element+", <label> not supported in SIMPLE list");
}
}
}
}
var orderedlists=doc.Descendants("list").Where(x=>x.Attribute("list-type").Value=="ordered");
if (orderedlists!=null)
{
foreach (var list in orderedlists)
{
var x=list.Descendants("list-item").Where(a=>!a.Elements("label").Any() || a.Element("label").Value.StartsWith(@"&#x")).Select(a=>((IXmlLineInfo)a).LineNumber);
if (x!=null)
{
foreach (var element in x)
{
Console.WriteLine("Check line: "+element+", <label> is either missing or has unsuppoted value for list-item (ORDERED list)");
}
}
}
}
var bulletlists=doc.Descendants("list").Where(x=>x.Attribute("list-type").Value=="bullet");
if (bulletlists!=null)
{
foreach (var list in bulletlists)
{
var x=list.Descendants("list-item").Where(a=>!a.Elements("label").Any() || !a.Element("label").Value.EndsWith(@"&#x")).Select(a=>((IXmlLineInfo)a).LineNumber);
if (x!=null)
{
foreach (var element in x)
{
Console.WriteLine("Check line: "+element+", <label> is either missing or has unsuppoted value for list-item (BULLET list)");
}
}
}
}
Console.ReadLine();
Но это не то, что я намеревался, вот файл образца
Требуемый вывод файла образца
Check line: 6, <label> is either missing or has unsuppoted value for list-item (ORDERED list)
Check line: 13, <label> not supported in SIMPLE list
Check line: 23, <label> is either missing or has unsuppoted value for list-item (ORDERED list)
Яполучение
Может ли кто-нибудь помочь мне с этим?
Примечание. Могут быть вложенные элементы list
внутри другого элемента list
с одинаковыми или разными list-type
значений.