【发布时间】:2018-11-15 14:36:49
【问题描述】:
我有一些 xml 文件,其中可能有一些名为 list 的元素,其属性 list-type 具有 3 个可能的值,分别为 ordered、bullet 和 simple。
现在
1) 对于list-type="ordered",每个元素list-item后面必须跟元素label和label的值不能以开头>
2) 对于list-type="bullet",每个元素list-item后面必须跟元素label和label的值必须以开头
3) 对于list-type="simple",每个元素list-item不得后跟元素label(简单列表没有标签)
我正在尝试根据其直接父元素list检查文件中是否有不遵循上述规则的list-item
我试过了
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();
但这并没有达到我的预期,这是sample file
示例文件的期望输出是
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 值。
【问题讨论】:
-
如果列表可以嵌套,则使用
Elements而不是Descendants获取列表项。 -
@juharr 但问题是我必须提供完整的元素树直到
list这会有所不同..示例文件只是一个简短的示例,可能还有其他元素也可能包含元素list的文件 -
你是说列表项可以嵌套在其他不是列表的节点中,比如
<list><somethingelse><list-item></list-item></somethingelse></list>?因为我只是在谈论一个列表和它的列表项之间的关系。您仍然可以使用Descendants来获取所有列表。 -
@juharr 不,您检查过示例文件吗?也是所需的输出和我得到的输出
-
是的,您获得简单列表的所有额外输出的原因是因为您在获取列表项时使用
Descendants而不是Elements。您可能对项目符号有另一个问题。
标签: c# xml-parsing linq-to-xml