Linq to XML查找属性并返回单独的属性值

时间:2017-10-04 16:29:23

标签: c# xml linq

<?xml version="1.0" ?>

                  

<aliasSection>
    <aliases>
        <clear />
        <add
            name="MAIN"
            server="JAG8MTO\SQLEXPRESS"
            database="RMain"
            trustedConnection="false" />            
        <add
            name="DEMO"
            server="JAG8MTO\SQLEXPRESS"
            database="RDemo"
            trustedConnection="false" />            
    </aliases>
</aliasSection>

在上面的xml doc中,我需要搜索别名,然后返回服务器和数据库属性。

这是我第一次使用xml文档时,我很难绕过它。

到目前为止,我有这个,我可以找到别名部分,但我不知道从这里开始。

 public void Read(string fileName)
    {
        XDocument doc = XDocument.Load(fileName);

        foreach (XElement el in doc.Root.Elements())
        {
            foreach (XAttribute attr in el.Attributes())

                if (attr.ToString() == "aliases")
                {
                    foreach (XElement element in el.Elements())
                        listBox1.Items.Add(element.Name + " " + element.Value);
                    foreach (XAttribute attrib in el.Attributes())
                        listBox1.Items.Add(attrib.Value);
                }

        }

    }

2 个答案:

答案 0 :(得分:1)

aliases是元素,而不是属性

var document = XDocument.Load(fileName);

var data = 
    document.Descendants("aliases") // Select all <aliases> elements
            .SelectMany(alias => alias.Elements("add")) // select all <add> elements
            .Select(add => new 
                    {
                        Name = add.Attribute("name").Value
                        Server = add.Attribute("server").Value
                    })
            .ToList();

listBox1.Items.AddRange(data);

data将包含所有<add>元素的选定值。

foreach (var item in data)
{
    Console.WriteLine($"Name: {item.Name}, Server: {item.Server}");
}

答案 1 :(得分:1)

   // Load the xml into XElement 
   XDocument doc = XDocument.Load("F:\\db.xml",LoadOptions.None);

   // Search through descendants and 
   // find one with name as MAIN
   XElement result = doc.Descendants("add")
  .FirstOrDefault(y => y.Attribute("name") != null &&
                     y.Attribute("name").Value == "MAIN");

    // Get the values if valid element is found  
    if(result != null)
    {
      string server = (result.Attribute("server") != null) ?  result.Attribute("server").Value : string.Empty;
      string database = (result.Attribute("database") != null) ?  result.Attribute("database").Value : string.Empty;
    }