【问题标题】:Reading XML file then sorting by name alphabetically读取 XML 文件,然后按名称按字母顺序排序
【发布时间】:2021-06-04 23:36:07
【问题描述】:

我正在尝试从 XML 文件中读取数据,我可以使用下面的代码来完成。

我将如何按名称的字母顺序对数据进行排序以用于电子菜单应用程序?

有人可以告诉我怎么做吗?

下面的代码块确实有效,但我不知道如何按节点类型按字母顺序对数据进行排序。

例如,我想按“姓名”的字母顺序排序。

其他排序方法可能包括按价格或类别排序等。

这里是 XML 数据结构:

<?xml version="1.0" encoding="UTF-8" ?>
<base>
    <menu>
        <item>
            <category></category>  
            <name></name>
            <price></price>
            <featured></featured>
            <code></code>
            <timestart></timestart>
            <timeend></timeend>
        </item>
    </menu>
</base>

代码如下:

public void XML_Get_MenuData()
{
    try
    {
        XmlDocument myDoc2 = new XmlDocument();

        myDoc2.Load("\\user\\today1.xml");

        XmlNodeList itemNodes = myDoc2.GetElementsByTagName("item");

        ushort i = 0;

        Menu_Items = 0;

        foreach (XmlNode sINode in itemNodes)
        {
            Category[i] = sINode["category"].InnerText;
            Console.PrintLine("category: {0}", Category[i]);

            ItemName[i] = sINode["name"].InnerText;
            Console.PrintLine("name: {0}", ItemName[i]);

            Price[i] = sINode["price"].InnerText;
            Console.PrintLine("price: {0}", Price[i]);

            Featured[i] = sINode["featured"].InnerText;
            Console.PrintLine("featured: {0}", Featured[i]);

            if (Featured[i] == "yes")
            {
                uFeatured[i] = 1;
            }
            else
            {
                uFeatured[i] = 0;
            }

            Code[i] = sINode["code"].InnerText;
            Console.PrintLine("code: {0}", Code[i]);


            TimeStart[i] = sINode["timestart"].InnerText;
            Console.PrintLine("timestart: {0}", TimeStart[i]);

            TimeEnd[i] = sINode["timeend"].InnerText;
            Console.PrintLine("timeend: {0}", TimeEnd[i]);

            i++;
        }

        Menu_Items = i;
        Console.PrintLine("Menu Items: {0}", Menu_Items);
    }
    catch
    {
        Console.PrintLine("missed Menu Items: {0}");
    }

}

【问题讨论】:

    标签: c# xml parsing


    【解决方案1】:

    你应该看看可爱的LINQ to XML,它可以让你做这样的事情:

    var Doc = XDocument.Load("PathToYourXml");
    
    var OrderedItems = Doc.Descendants("item").OrderBy(x => x.Element("name").Value);
    

    OrderedItems 包含您的对象,按其名称的字母顺序排列,形状为XElements 的一束 (bunch = IOrderedEnumerable)。 如果您想按降序排列,只需使用OrderByDescending

    var OrderedItems = Doc.Descendants("item").OrderByDescending(x => x.Element("name").Value);
    

    附带说明一下,现在您正在迭代您的项目并打印它们,并且显然将数据水平存储在数组中。将它们映射到一个类将有助于避免必须使用容易出错的“item”和“name”之类的神奇字符串。我鼓励您为您的项目创建一个模型,并研究一下如何将 XML 解析为您的对象列表,使用类似 XmlSerializer 的东西,也许看看像 this 这样的问题,其中你会找到一些替代品。

    【讨论】:

    • 我同意你的观点,LINQ 是完成这类工作的好工具。我不同意您将数据绑定到 C# 类的观点。如果数据格式发生变化,这样做会给您带来很大的麻烦。
    • 这绝对是一种权衡,并且取决于变化的轴,但如果你想做一些事情,比如添加价格或按日期排序,你将不得不开始对数据做出假设反正结构。 (另外,我想让 OP 检查一些潜在的新概念。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多