Как извлечь элементы из строки как xml и вернуть часть значения элемента - PullRequest
0 голосов
/ 30 марта 2020

Я планирую извлечь идентификатор в соответствии с сообщением, которое хранится в файле журнала. Например: если сообщение «Приложение запущено», я должен связать идентификатор сообщения и вернуться в бесчисленный список.

Вот моя строка xml:

String xml =
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
            "<log>\n" +
            "    <entry id=\"1\">\n" +
            "        <message>Application started</message>\n" +
            "    </entry>\n" +
            "    <entry id=\"2\">\n" +
            "        <message>Application ended</message>\n" +
            "    </entry>\n" +
            "</log>";

И в моем основном методе я вызываю GetIDsByMessage для чтения строки:

foreach (int id in LogParser.GetIdsByMessage(xml, "Application ended"))
        Console.WriteLine(id);

И я определяю свой GetIdsByMessage как:

public static IEnumerable<int> GetIdsByMessage(string xml, string message)
{
     // write to return id {2} for message="Application ended"
}

Я попытался проанализировать строку как xml вот так:

 XmlDocument xmltest = new XmlDocument();
 xmltest.LoadXml(xml);

 XmlNodeList elemlist = xmltest.GetElementsByTagName("message");

Но я не уверен, как собрать все идентификаторы и вернуть их вызывающей стороне. Любые указатели?

Вот мой полный код:

 public class LogParser
    {
    public static IEnumerable<int> GetIdsByMessage(string xml, string message)
    {
         // write to return id {2} for message="Application ended"
         XmlDocument xmltest = new XmlDocument();
         xmltest.LoadXml(xml);

         XmlNodeList elemlist = xmltest.GetElementsByTagName("message");
    }

    public static void Main(string[] args)
    {
        String xml =
                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "<log>\n" +
                "    <entry id=\"1\">\n" +
                "        <message>Application started</message>\n" +
                "    </entry>\n" +
                "    <entry id=\"2\">\n" +
                "        <message>Application ended</message>\n" +
                "    </entry>\n" +
                "</log>";

        foreach (int id in LogParser.GetIdsByMessage(xml, "Application ended"))
            Console.WriteLine(id);
    }
}

Спасибо

1 Ответ

2 голосов
/ 30 марта 2020

Вы можете легко использовать Linq-to- XML:

public static IEnumerable<int> GetIdsByMessage(string xml, string message) =>
    XDocument
        .Parse(xml)
        .Root
        .Descendants("message")
        .Where(x => x.Value == message)
        .Select(x => (int)x.Parent.Attribute("id"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...