Получить узел XML с фильтром - PullRequest
1 голос
/ 28 марта 2012

У меня есть следующий xml:

<Histories>
  <History>
    <Date>2011.11.11 08:45</Date>
    <Action>Add</Action>
  </History>
  <History>
    <Date>2011.11.12 08:45</Date>
    <Action>Modify</Action>
  </History>
  <History>
    <Date>2011.11.13 08:45</Date>
    <Action>Delete</Action>
  </History>
  <History>
    <Date>2011.11.14 08:45</Date>
    <Action>Add</Action>
  </History>
  <History>
    <Date>2011.11.15 08:45</Date>
    <Action>Modify</Action>
  </History>
  <History>
    <Date>2011.11.16 08:45</Date>
    <Action>Delete</Action>
  </History>
  <History>
    <Date>2011.11.17 08:45</Date>
    <Action>Add</Action>
  </History>
  <History>
    <Date>2011.11.18 08:45</Date>
    <Action>Modify</Action>
  </History>
  <History>
    <Date>2011.11.19 08:45</Date>
    <Action>Delete</Action>
  </History>
  <History>
    <Date>2011.12.20 08:45</Date>
    <Action>Modify</Action>
  </History>
</Histories>

Мне нужно получить последний узел с действием (Добавить / Изменить / Удалить).Как я могу сделать?

Пример:

Добавить 2011.11.17 08: 45

Изменить 2011.12.20 08: 45

Удалить 2011.11.19 08: 45

Я делаю: / Истории / История / Действие [text () = 'Добавить'] /../../ История [position () = last ()] - это не работает.

Спасибо

Ответы [ 4 ]

1 голос
/ 28 марта 2012

Использование :

/*/History[Action = 'Delete'] [last()]

Выбирает последний элемент History, который имеет дочерний элемент Action со строковым значением "Delete" и тот (элемент History)является потомком верхнего элемента XML-документа.

1 голос
/ 28 марта 2012
$arr = array('Add','Modify','Delete');
foreach ($arr as $action) {
    $res = $xPath->query('/Histories/History[Action="'.$action.'"][last()]/Date');
    echo "Last $action: " . $res->item(0)->nodeValue . "\n";
}

РЕДАКТИРОВАТЬ: Вот компактный ответ: /Histories/History[Action="Add"][last()]/Date

0 голосов
/ 19 ноября 2013
public void insertToDo(string item, string date, string time, string due, string description)
        {
            XElement xEmp = XElement.Load(@"C://Users//Khulu//Documents//Visual Studio 2012//Projects//AMD//Schedule//ToDo.xml");
            //
            xEmp.Add(
                     new XElement("ToDo",
                      new XElement("Item", item),
                       new XElement("date", date),
                        new XElement("time", time),
                        new XElement("due", due),
                        new XElement("description", description))
            );
            xEmp.Save(@"C://Users//Khulu//Documents//Visual Studio 2012//Projects//AMD//Schedule//ToDo.xml");
        }
        public DataSet displayGrid()`enter code here`
        {
            DataSet ds = new DataSet();
            ds.ReadXml("C://Users//Khulu//Documents//Visual Studio 2012//Projects//AMD//Schedule//ToDo.xml");
            return ds;
        }
        public void deleteXml(string item)
        {
            XDocument doc = XDocument.Load("C://Users//Khulu//Documents//Visual Studio 2012//Projects//AMD//Schedule//ToDo.xml");
            doc.Root.Elements("ToDo")
            .Elements("Item")
            .Where(l => l.Value == item)
            .Select(x => x.Parent)
            .Remove();
            doc.Save("C://Users//Khulu//Documents//Visual Studio 2012//Projects//AMD//Schedule//ToDo.xml");
        }
        public void updateTodo(string item, string date, string time, string due, string description)
        {

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("C://Users//Khulu//Documents//Visual Studio 2012//Projects//AMD//Schedule//ToDo.xml");

            foreach (XmlNode node in xmlDoc.SelectNodes("toDoList/ToDo"))
            {
                if (node.SelectSingleNode("Item").InnerText == item)
                {
                    node.SelectSingleNode("Item").InnerText = item;
                    node.SelectSingleNode("date").InnerText = date;
                    node.SelectSingleNode("time").InnerText = time;
                    node.SelectSingleNode("due").InnerText = due;
                    node.SelectSingleNode("description").InnerText = description;

                }

            }
           xmlDoc.Save("C://Users//Khulu//Documents//Visual Studio 2012//Projects//AMD//Schedule//ToDo.xml");
        }

    }
}
0 голосов
/ 28 марта 2012

Рассмотрите возможность использования linq to XML

Вспомогательный метод:

string GetValue(XDocument xDocument, string action)
{
    var xElements = xDocument.Descendants("Action").Where(x => x.Value == action);
    var xElement = xElements.Last().Parent;
    return xElement.Element("Date").Value;
}

Использование:

var xml = @"<Histories>
  <History>
    <Date>2011.11.11 08:45</Date>
    <Action>Add</Action>
  </History>
...
  <History>
    <Date>2011.12.20 08:45</Date>
    <Action>Modify</Action>
  </History>
</Histories>";

var xDocument = XDocument.Parse(xml);

var lastAdd= GetLast(xDocument, "Add");
var lastModify = GetLast(xDocument, "Modify");
var lastDelete = GetLast(xDocument, "Delete"); 

string GetLast(XDocument xDocument, string action)
{
    var xElements = xDocument.Descendants("Action").Where(x => x.Value == action);
    var xElement = xElements.Last().Parent;
    return xElement.Element("Date").Value;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...