如何检查节点属性中的缺失值?

时间:2018-04-30 16:05:38

标签: c# xml linq-to-xml

如何检查特定节点属性值中的缺失/跳过值 e.x.

<?xml version="1.0"?>
<root>
    <lvl id="abc1">1036</lvl>
    <lvl id="abc2">0036</lvl>
    <lvl id="abc3">3.<dc>04</dc></lvl>
    <lvl id="abc5">87.<dc>03</dc></lvl>
    <lvl id="abc6">996</lvl>
    <lvl id="abc10">203</lvl>
</root>

在上面的xml中, id 属性值 abc4 abc7 abc8 abc9 < / strong>缺少..我如何检查这些并使用linq获取这些值到xml,以便我可以写一个日志文件或者说这些值丢失的东西,检查文件?

我正在考虑使用像

这样的辅助方法
public  static Boolean CompareNext(this XElement xe)
        {
            return Convert.ToInt16(xe.Attribute("id").Value.Replace("abc", ""))+1== Convert.ToInt16(xe.ElementsAfterSelf().FirstOrDefault().Attribute("rid").Value.Replace("ref", ""));
        }

但努力正确地实施它..

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是通过替换"abc"来提取所有ID的数量:

//Load the document
XDocument doc = XDocument.Load(@"PATH_TO_FILE.xml");

//Extract all ID's
var ids = new List<int>();
foreach (var lvl in doc.Root.Elements())
{
    if (int.TryParse(lvl.Attribute("id").Value.Replace("abc", ""), out int id))
    {
        ids.Add(id);
    }
}

根据最小值和最大值,可以创建所有预期ID的范围。现在,您可以获得所有遗漏的ID:

//Get the missing ID's
int minId = ids.Min();
int maxId = ids.Max();
var missingIds = Enumerable.Range(minId, maxId - minId).Except(ids);