【问题标题】:Linq to XML Find a an attribute and return seperate attribute valueLinq to XML 查找一个属性并返回单独的属性值
【发布时间】:2017-10-05 01:13:16
【问题描述】:
<?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 文档中,我需要搜索一个别名,然后返回服务器和数据库属性。

这是我第一次使用 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);
                }

        }

    }

【问题讨论】:

  • aliases 是元素,不是属性

标签: c# xml linq


【解决方案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 将包含所有&lt;add&gt; 元素的选定值。

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

【讨论】:

  • 如何检查名称是什么,然后返回服务器值?例如,如果 name = DEMO 则返回 DEMO 的服务器值
  • @PaulWalker,您可以选择匿名(或预定义)类型中的所有必需值,而不是只选择名称
  • 这正是我想要做的...非常感谢您的帮助。你知道有什么好的资源来学习这个吗?
【解决方案2】:
   // 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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2012-09-24
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多