代码之家  ›  专栏  ›  技术社区  ›  Leo

c#查找具有特定子元素的元素

  •  1
  • Leo  · 技术社区  · 6 年前

    Sample

    示例代码查找其子元素的值与在texbox中输入的值匹配的元素的属性名称

    现在看看我的代码和XMLfile,您将看到它们与上面的链接相同。问题是,我的代码只打印与文本框值匹配的第一个组。

    XML
    <?xml version="1.0" encoding="utf-8"?>
    <groups>
      <group name="a">
        <ip>10.3.4</ip>
        <ip>10.1.4</ip>
      </group>
      <group name="b">
        <ip>10.2.1</ip>
        <ip>10.3.4</ip>
        <ip>10.55.55</ip>
      </group>
     </groups>
    

    密码

    XElement root = XElement.Load("c:\etc);
    IEnumerable<XElement> tests =
       from el in root.Elements("group")
       where (string)el.Element("ip") == textBox1.Text
       select el;
    
    foreach (XElement el in tests)
       Console.WriteLine((string)el.Attribute("name"));
    

    问题出在where子句中。因为如果我对其进行注释,系统将打印两个组名,但当where子句处于活动状态时,它总是只返回1个组。还不如使用FirstOrDefault()-_-

    4 回复  |  直到 6 年前
        1
  •  0
  •   Backs    6 年前
    var tests =
        from el in root.Elements("group")
        where el.Elements("ip").Any(o => o.Value == textBox1.Text)
        select el;
    
        2
  •  0
  •   Michał Turczyn    6 年前

    请尝试以下代码:

    XElement root = XElement.Load(@"your path to a file");
    //set text box to some default value to test if function will work
    textBox1.Text = "10.1.4";
    //here I used etension method, commented is alternative version, for better understanding
    IEnumerable<XElement> tests = root.Elements("group").Where(gr => gr.Elements("ip").Any(ip => ip.Value == textBox1.Text));
    //IEnumerable<XElement> tests = root.Elements("group").Where(gr => gr.Elements("ip").Where(ip => ip.Value == textBox1.Text).Count() > 0);
    foreach (XElement el in tests)
        //Console.WriteLine((string)el.Attribute("name"));
        MessageBox.Show((string)el.Attribute("name"));
    

    您的代码不起作用,因为您将单个元素与文本框的文本进行了比较。您要检查的是 ip 元素等于指定的文本。

        3
  •  0
  •   Carlos Henrique    6 年前

    在这两个组中,您拥有相同的ip

    <ip> 10.3.4 </ ip>
    

    在这种情况下,它甚至会将这两个群体聚集在一起。

    我建议通过检查“名称”再做一个条件。

        4
  •  0
  •   TVOHM    6 年前
    var xml = XDocument.Parse(xmlString);
    // a, b
    string[] matchingNames = xml.Root.Elements("group")
        .Where(g => g.Elements("ip").Any(e => e.Value == textBoxText))
        .Select(g => g.Attribute("name").Value).ToArray();
    

    从任何子ip元素包含文本框文本的组中选择属性名称。