将XML文件读入内存并搜索它

本文关键字:搜索 内存 XML 文件 | 更新日期: 2023-09-27 18:18:51

我有一个需要处理的XML文件。为了便于论证,假设我已经把它作为一个字符串加载进来了。

<?xml version="1.0" encoding="UTF-8" ?> 
<GROUP ID="_group_id" ORDERINFO="00000" TITLE="Group 1">
  <GROUP ID="_group_id_2" TITLE="Group 2">
    <LO ID="_id_code1" LANG="enUS" TYPE="_cust" TITLE="Title 1" /> 
    <LO ID="_id_code2" LANG="enUS" TYPE="_cust" TITLE="Title 2" /> 
  </GROUP>
  <GROUP ID="_group_id_3" TITLE="Group 3">
    <LO ID="_id_code1" LANG="enUS" TYPE="_cust" TITLE="Title 1" /> 
    <LO ID="_id_code2" LANG="enUS" TYPE="_cust" TITLE="Title 2" /> 
  </GROUP>
</GROUP>

在给定的XML文件中可以有多个lo和多个group。我尝试了各种方法,但都不成功。我需要一些东西,它将根据ID找到与给定字符串相匹配的LO,然后允许我检索相应的TYPE和TITLE到字符串中,以便我可以使用它们进行处理。

我尝试将文件读取为XmlDocument,但一旦加载,我就不知道如何找到适当的元素。

抱歉在编辑之前发布-一些文本被截断了

将XML文件读入内存并搜索它

您可以使用XmlDocumentXDocument来解析Xml

下面是XDocument的例子:

数据类:

public class Lo
{
    public string Id { get; set; }
    public string Lang { get; set; }
    public string Type { get; set; }
    public string Title { get; set; }
}
代码:

var document = XDocument.Parse(data);
var value = "_id_code1";
IEnumerable<Lo> result = 
    document.XPathSelectElements(".//LO")
            .Where(x => x.Attribute("ID").Value == value)
            .Select(x =>
                new Lo
                {
                    Id = x.Attribute("ID").Value,
                    Lang = x.Attribute("LANG").Value,
                    Type = x.Attribute("TYPE").Value,
                    Title = x.Attribute("TITLE").Value
                });

当加载到XmlDocument中时,您可以使用XPath来定位注释。

例句:

XmlNode group = xmlDocument.SelectSingleNode("/GROUP/GROUP[@ID='_group_id_2']");

或:

XmlNodeList groups = xmlDocument.SelectNodes("/GROUP/GROUP");
foreach(XmlNode group in groups)
{
    string id = group.Attributes["ID"].Value;
}

这很容易。

参见文档:

  • . net框架中的XML概述。.NET框架中的XML处理选项

最好将XAtribute转换为string,然后访问其Value属性(如果没有找到某些属性,您将获得null而不是异常)。这里的查询语法也更紧凑

string id = "_id_code1";
XDocument xdoc = XDocument.Parse(xml);
var query = from lo in xdoc.Descendants("LO")
            where (string)lo.Attribute("ID") == id
            select new {
                Id = (string)lo.Attribute("ID"),
                Language = (string)lo.Attribute("LANG"),
                Type = (string)lo.Attribute("TYPE"),
                Title = (string)lo.Attribute("TITLE")
            };

这个查询将返回具有属性Id, Language, Type, Title的匿名对象序列。您可以使用foreach来枚举它们。

我做了一个小的测试应用程序,我把你的xml作为字符串。

            var xmlMessage = @"keep your xml here, I removed due to formatting";
        var matchedElements = XDocument.Parse(xmlMessage).Descendants().Where(el => el.Name == "LO" && el.Attribute("ID").Value == "_id_code1");
        foreach (var el in matchedElements)
        {
            Console.WriteLine("ElementName : {0}'nID = {1}'nLANG = {2}'nTYPE = {3}'nTITLE = {4}'n"
                , el.Name.LocalName, el.Attribute("ID").Value, el.Attribute("LANG").Value, el.Attribute("TYPE").Value, el.Attribute("TITLE").Value);
         }

这将帮助您获取ID为"_id_code"的所有LO元素,而不考虑GROUP元素。如果需要考虑组,请将第二行代码替换为:

var matchedElements = XDocument.Parse(xmlMessage).Descendants().Where(el => el.Parent != null && el.Parent.Attribute("ID").Value == "_group_id_2" && el.Name == "LO" && el.Attribute("ID").Value == "_id_code1");

这里,我检查的是"_group_id_2",你可以用你的组id代替。

所需的命名空间:

using System.Linq;
using System.Xml;
using System.Xml.Linq;