Как проверить отсутствие значения в атрибуте узла? - PullRequest
0 голосов
/ 30 апреля 2018

Как проверить пропущенное / пропущенное значение в значении определенного узла 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 ... как я могу проверить их и получить эти значения, используя 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", ""));
        }

Но изо всех сил пытается реализовать это правильно ..

1 Ответ

0 голосов
/ 30 апреля 2018

Одним из возможных решений является извлечение количества всех идентификаторов путем замены "abc":

//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);
    }
}

На основе минимального и максимального значений можно создать диапазон всех ожидаемых идентификаторов. Теперь вы можете получить все недостающие идентификаторы:

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