首页 > 解决方案 > 如何从字符串中提取元素作为 xml 并返回元素值的一部分

问题描述

我计划根据消息提取 id,id 保存在日志文件中。例如:如果消息是“应用程序已启动”,我应该关联消息的 id 并返回一个无法计数的列表。

这是我的 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");

但我不知道如何收集所有的 id 并将其返回给调用者。任何指针?

这是我的完整代码:

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

谢谢

标签: c#xml

解决方案


您可以轻松地使用 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"));

推荐阅读