Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C在XML文件中查找特定数据_C#_Xml - Fatal编程技术网

C# C在XML文件中查找特定数据

C# C在XML文件中查找特定数据,c#,xml,C#,Xml,我是一名代码初学者,我正在寻求XML文件的帮助,我做了一个项目来显示食物菜单和创建随机菜单,开胃菜、主菜和甜点将在不同的XML文件中,我的问题是我从来没有处理过XML文件,所以我很糟糕 实际上,我的软件看起来是这样的:它是法语的,但标签是开胃菜、主菜和甜点,然后,选择随机菜单 因此,我的软件需要这样工作: 第一个组合框用于显示所有名称,因此它从XML中获取每个初学者的名称,并将其显示在组合框中。我真的那样做了 然后,当我在组合框中选择初学者时,软件需要在XML中找到描述和配方,并在我的屏幕截图上

我是一名代码初学者,我正在寻求XML文件的帮助,我做了一个项目来显示食物菜单和创建随机菜单,开胃菜、主菜和甜点将在不同的XML文件中,我的问题是我从来没有处理过XML文件,所以我很糟糕

实际上,我的软件看起来是这样的:它是法语的,但标签是开胃菜、主菜和甜点,然后,选择随机菜单

因此,我的软件需要这样工作:

第一个组合框用于显示所有名称,因此它从XML中获取每个初学者的名称,并将其显示在组合框中。我真的那样做了

然后,当我在组合框中选择初学者时,软件需要在XML中找到描述和配方,并在我的屏幕截图上的listboxlike中显示,我需要这样做

我的XML文件的使用方式:

<?xml version="1.0" encoding="utf-8" ?>
<xmlentrees>
  <entrees>
    <entree>
      <Nomentree>STARTER NAME</Nomentree>
      <descentree>STARTER DESC.</descentree>
      <recette>
        AND
        THERE
        THE
        RECIPE
      </recette>
    </entree>
    <entree>
      <Nomentree>STARTER NAME</Nomentree>
      <descentree>STARTER DESC.</descentree>
      <recette>
        AND
        THERE
        THE
        RECIPE
      </recette>
    </entree>
  </entrees>
</xmlentrees>
这是我的c代码

#region entree

const string XMLENTREES = @"c:\temp\entree.xml"; // i pasted the xml file in temp cuz if he's in my resources, i can't load it
private List<string> names;
private Dictionary<string, string> dict;
private List<Entree> entrees;


private void xmlentree()
{
    XDocument doc = XDocument.Load(XMLENTREES);

    entrees = doc.Descendants("entree").Select(x => new Entree()
        {
            nomentree = (string)x.Element("Nomentree"),
            descentree = (string)x.Element("descentree"),
            recette = (string)x.Element("recette")
        }).ToList();

    dict = entrees.GroupBy(x => x.nomentree, y => y)
                      .ToDictionary(x => x.Key, y => y.ToList());

    names = dict.Select(x => x.Key).ToList(); // MY LIST OF STARTERS NAMES

    object[] array = names.ToArray<object>();
    comboBox1.Items.AddRange(array);
}

public class Entree
{
    public string nomentree { get; set; }
    public string descentree { get; set; }
    public string recetteentree { get; set; }
    public string recette { get; set; }
}

#endregion entree


private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (names.Contains(comboBox1.SelectedItem.ToString())) //HERE I CAN CHECK IF THE NAME IN COMBO BOX MATCH WITH MY LIST OF STARTERS NAMES
    {

    }
}

您可以使用以下命令

创建序列化程序以将xml文件转换为基于类的数据。 将xml反序列化为XmlEnteres类对象。 根据初学者名称查找主菜 我在这里做的是打印第一个mathces开始的名字。 反序列化所需的类


如果您有xml文件,但不确定类应该如何编写,请使用site将xml自动转换为类。

向类中添加打印方法:

        public class Entree
        {
            public string nomentree { get; set; }
            public string descentree { get; set; }
            public string recetteentree { get; set; }
            public string recette { get; set; }

            public string Print(Entree entree)
            {
                return string.Format("Norm : {0}\nDescription : {1}\n Recette : {2}",
                    entree.nomentree, entree.descentree, entree.recetteentree);
            }
         }

您可以使用LINQ to XML查询XML,并提取所需的字段:

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (names.Contains(comboBox1.SelectedItem.ToString())) //HERE I CAN CHECK IF THE NAME IN COMBO BOX MATCH WITH MY LIST OF STARTERS NAMES
        {
            XElement entreeXml = XElement.Load(@"c:\temp\entree.xml");

            var query = (from x in entreeXml.Element("entrees").Elements("entree")
                         where (string)x.Element("Nomentree") == comboBox1.SelectedItem.ToString()
                         select new
                         {
                             Description = (string)x.Element("descentree"),
                             Recipe = (string)x.Element("recette")
                         }).SingleOrDefault();

            if (query != null)
            {
                // Set listbox values to query.Description and query.Recipe
            }
        }
    }
您好,谢谢您的回答,我的问题解决了,效果很好

Jawad,关于XML2CSharp,我不知道,但我下次需要使用XML时会使用它,谢谢分享

        public class Entree
        {
            public string nomentree { get; set; }
            public string descentree { get; set; }
            public string recetteentree { get; set; }
            public string recette { get; set; }

            public string Print(Entree entree)
            {
                return string.Format("Norm : {0}\nDescription : {1}\n Recette : {2}",
                    entree.nomentree, entree.descentree, entree.recetteentree);
            }
         }
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (names.Contains(comboBox1.SelectedItem.ToString())) //HERE I CAN CHECK IF THE NAME IN COMBO BOX MATCH WITH MY LIST OF STARTERS NAMES
        {
            XElement entreeXml = XElement.Load(@"c:\temp\entree.xml");

            var query = (from x in entreeXml.Element("entrees").Elements("entree")
                         where (string)x.Element("Nomentree") == comboBox1.SelectedItem.ToString()
                         select new
                         {
                             Description = (string)x.Element("descentree"),
                             Recipe = (string)x.Element("recette")
                         }).SingleOrDefault();

            if (query != null)
            {
                // Set listbox values to query.Description and query.Recipe
            }
        }
    }