vignesht50 Ответов: 2

Удалить элемент из XML на основе условия


Привет,

Ниже приведена структура XML, которая у меня есть.

XML
<Info>
<Details>
<ID>user</ID>
<StartDate>23-10-2016</StartDate>
<EndDate>22-10-2016</EndDate>
</Details>
<Details>
<ID>user1</ID>
<StartDate>23-10-2016</StartDate>
<EndDate>24-10-2016</EndDate>
</Details>
<Details>
<ID>user2</ID>
<StartDate>23-10-2016</StartDate>
<EndDate>22-11-2016</EndDate>
</Details>
</Info>


Now I need to compare the EndDate node with today's date. If EndDate is lesser than today's date then I need to remove the whole contents of Details. For Ex: Let's assume strDate a string has today's date.

The below code takes all the values of EndDate and now how can I compare the string value and loop through xml elements and delete them.



Now this whole portion should be deleted as of comparing with todays date.

<Details>
<ID>user</ID>
<StartDate>23-10-2016</StartDate>
<EndDate>22-10-2016</EndDate>
</Details>


Очень ценю любые предложения по этому поводу.

Что я уже пробовал:

object[] arr = xDos.Потомки ("Подробности").Элементы ("Конечная Дата").
Select (element = элемент.Ценность).Метод toArray();

2 Ответов

Рейтинг:
0

Scyldshefing

Это решение будет работать, но может потерпеть неудачу, если XML либо не содержит узел EndDate, либо узел EndDate не является допустимой датой (я создал его как модульный тест) [это может быть смягчено некоторой формой xsd-проверки XML, где EndDate является обязательной датой]

public void TestMethod1()
        {
            var todaysDate1 = new DateTime(2001, 10, 30); // no nodes selected
            var todaysDate2 = new DateTime(2016, 10, 28); // one node selected
            var todaysDate3 = new DateTime(2016, 10, 30); // 2 nodes selected
            var todaysDate4 = new DateTime(2016, 12, 25); // 3 nodes selected

            var xmlData ="<Info><Details><ID>user</ID><StartDate>23-10-2016</StartDate><EndDate>22-10-2016</EndDate></Details><Details><ID>user1</ID><StartDate>23-10-2016</StartDate><EndDate>29-10-2016</EndDate></Details><Details><ID>user2</ID><StartDate>23-10-2016</StartDate><EndDate>22-11-2016</EndDate></Details></Info>";
            XDocument xdoc = XDocument.Parse(xmlData);

            var nodes = xdoc.Descendants("Details");
            nodes.Where(x => DateTime.Compare(DateTime.Parse(x.Element("EndDate").Value), todaysDate1) > 0).Remove();

            Assert.AreEqual(0, xdoc.Descendants("Details").Count());

            // Test 2
            xdoc = XDocument.Parse(xmlData);
            nodes = xdoc.Descendants("Details");
            nodes.Where(x => DateTime.Compare(DateTime.Parse(x.Element("EndDate").Value), todaysDate2) > 0).Remove();
            Assert.AreEqual(1, xdoc.Descendants("Details").Count());

            // Test 3
            xdoc = XDocument.Parse(xmlData);
            nodes = xdoc.Descendants("Details");
            nodes.Where(x => DateTime.Compare(DateTime.Parse(x.Element("EndDate").Value), todaysDate3) > 0).Remove();
            Assert.AreEqual(2, xdoc.Descendants("Details").Count());

            // Test 4
            xdoc = XDocument.Parse(xmlData);
            nodes = xdoc.Descendants("Details");
            nodes.Where(x => DateTime.Compare(DateTime.Parse(x.Element("EndDate").Value), todaysDate4) > 0).Remove();
            Assert.AreEqual(3, xdoc.Descendants("Details").Count());
        }


Рейтинг:
0

Scyldshefing

Проблема нулевого исключения беспокоила меня - но благодаря Resharper здесь есть альтернатива (я не смог решить проблему недопустимой даты)

nodes.Where(x =>
                {
                    var element = x.Element("EndDate");
                    return element != null && DateTime.Compare(DateTime.Parse(element.Value), todaysDate1) > 0;
                }).Remove();