【问题标题】:How to check for a missing value in a node attribute?如何检查节点属性中的缺失值?
【发布时间】:2018-04-30 16:05:38
【问题描述】:

如何检查特定节点属性值中的缺失/跳过值 前任。

<?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 属性值 abc4abc7abc8abc9 丢失..如何检查这些并使用 linq to 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", ""));
        }

但努力正确实施它..

【问题讨论】:

  • 这些条目及其属性的顺序是否始终正确?
  • @Fruchtzwerg 不一定......它可能是也可能不是
  • 这不是简单地了解预期值列表,将这些值与观察值进行比较,然后打印差异吗? o_0

标签: c# xml linq-to-xml


【解决方案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);

【讨论】:

  • 如何在旧版 c# (.NET 4.5) 中使用if (int.TryParse(lvl.Attribute("id").Value.Replace("abc", ""), out int id))
  • 喜欢int id = 0; if (int.TryParse(lvl.Attribute("id").Value.Replace("abc", ""), out id)) ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 2019-04-11
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多