繁体   English   中英

在c#中检索xml文件中具有相同关键字的其他数据

[英]retrieve the other data that have the same keyword in xml file in c#

我将所有数据保存在xml文件中。

<myself>
  <name>sara</name>
  <age>20</age>
  <gender>female</gender>
</myself>
<myself>
   <name>bob</name>
   <age>29</age>
   <gender>male</gender>
</myself>

并且有搜索框,用户可以根据类型和关键字搜索所有数据。 为此,我提出了两种类型:名称和性别。

因此,一旦用户选择名称并将关键字设置为sara ,输出将显示有关她的所有内容。

应该显示输出的例子

sara
20
female

对于此输出,我使用每个自己的文本框显示它。 有3个文本框标题名称,年龄和性别。

XmlDocument xml = new XmlDocument();            
        xml.Load("C:\\Users\\HDAdmin\\Documents\\Fatty\\SliceEngine\\SliceEngine\\bin\\Debug\\saya.xml");
        XmlNodeList xnList = xml.SelectNodes("/myself");            
        foreach (XmlNode xn in xnList)
        {                
            string name = xn.InnerText;                
            nameBox.Text = nameBox.Text + " " + name;
            string age = xn.InnerText;                
            ageBox.Text = ageBox.Text + " " + age;
            string gender = xn.InnerText;                
            genderBox.Text = genderBox.Text + " " + gender;
        }

我尝试过使用XmlNodeList xnList = xml.SelectNodes("/myself"); 但它会打印出关于sara和bob的一切。

所以我猜我可以让xml文件像

<name>sara
   <gender>female
       <age>20</age>
   </gender>
</name>

但我认为这无法解决。 这有什么办法吗?

这是保存数据的方法。

XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load("C:\\Users\\HDAdmin\\Documents\\SliceEngine\\SliceEngine\\bin\\Debug\\saya.xml");
                XmlElement contentElement = xmlDoc.CreateElement("myself");

                XmlElement nameEl = xmlDoc.CreateElement("name");
                XmlText xmlText = xmlDoc.CreateTextNode(berjaya[1]);
                nameEl.AppendChild(xmlText);
                contentElement.AppendChild(nameEl);
                xmlDoc.DocumentElement.AppendChild(contentElement);

                XmlElement ageEl = xmlDoc.CreateElement("age");
                ageEl.InnerText = berjaya[3];
                contentElement.AppendChild(ageEl);
                xmlDoc.DocumentElement.AppendChild(contentElement);

                XmlElement genEl = xmlDoc.CreateElement("gender");
                genEl.InnerText = berjaya[39];
                contentElement.AppendChild(genEl);
                xmlDoc.DocumentElement.AppendChild(contentElement);

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

谢谢您的帮助。 这已经解决了。 我正在使用@horgh给出的答案。

所以这就是我学到的东西。

1-在我的xml文件中,我需要有主标签。

2-使用if循环从关键字中检索数据。

并查看其他数据,它将是这样的:

string name = xn.OfType<XmlNode>().FirstOrDefault(n => n.Name == "name").FirstChild.Value;
            if (name == "sara")
            {
                nameBox.Text = nameBox.Text + " " + name;
                string age = xn.OfType<XmlNode>().FirstOrDefault(n => n.Name == "age").FirstChild.Value;
                ageBox.Text = ageBox.Text + " " + age;
                string gender = xn.OfType<XmlNode>().FirstOrDefault(n => n.Name == "gender").FirstChild.Value;
                genderBox.Text = genderBox.Text + " " + gender; 

            }

有关详细信息,请参阅下文。 再次感谢所有帮助。

这是一个例子

    [Test]
    public void Test()
    {
        XElement root = XElement.Load(@"C:\Data.xml");
        XElement person = FindByName(root, "sara");
        if (person == null)
        {
            return;
        }
        Console.WriteLine("Name: {0}, Age: {1}, Gender: {2}",
                          person.Element("name").Value,
                          person.Element("age").Value,
                          person.Element("age").Value);
    }

    private static XElement FindByName(XContainer root, string name)
    {
        return root.Descendants()
            .Where(x => x.Name.LocalName == "name" && x.Value == name)
            .Select(x => x.Parent)
            .FirstOrDefault();
    }

Xml文件:已添加根元素

<root>
  <myself>
    <name>sara</name>
    <age>20</age>
    <gender>female</gender>
  </myself>
  <myself>
    <name>bob</name>
    <age>29</age>
    <gender>male</gender>
  </myself>
</root>

控制台输出:

Name: sara, Age: 20, Gender: 20

建议:

  • FindByName可能应该返回多于1个元素,即List<XElement>
  • 添加具有属性Name,Age,Gender的Person类

起初,我有一个错误,说xml没有root元素,所以我添加了root标签:

<main>
 <myself>
  <name>sara</name>
  <age>20</age>
  <gender>female</gender>
</myself>
<myself>
  <name>bob</name>
  <age>29</age>
  <gender>male</gender>
</myself>

比我添加了对所请求名称的检查,即“sara”:

if (name == "sara")

因此,生成的代码是:

        XmlDocument xml = new XmlDocument();
        xml.Load("1.xml");
        XmlNodeList xnList = xml.SelectNodes("/main/myself");
        foreach (XmlNode xn in xnList)
        {
            string name = xn.OfType<XmlNode>().FirstOrDefault(n => n.Name == "name").FirstChild.Value;
            if (name == "sara")
            {
                nameBox.Text = nameBox.Text + " " + name;
                string age = xn.OfType<XmlNode>().FirstOrDefault(n => n.Name == "age").FirstChild.Value;
                ageBox.Text = ageBox.Text + " " + age;
                string gender = xn.OfType<XmlNode>().FirstOrDefault(n => n.Name == "gender").FirstChild.Value;
                genderBox.Text = genderBox.Text + " " + gender;                                        
            }
        }

输出是:

sara
20
female

怎么样

XmlDocument xml = new XmlDocument();            
xml.Load("YourFilePath");        
foreach(var xml in doc.Elements("rootelement").Elements("myself").Elements("name")) 
{
     //Do what you want.
}

你指定的XPath将选择所有名为“我自己”的元素,它们正确地返回sara和bob的数据。

尝试在SelectNodes调用中使用“// myself [name = sara]”。 它应该只返回名称值为sara的我自己的元素。

PS:我还建议将自己的元素重命名为Person或类似的东西。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM