【问题标题】:Return all matching XML nodes using LINQ使用 LINQ 返回所有匹配的 XML 节点
【发布时间】:2013-12-28 03:40:05
【问题描述】:
<?xml version='1.0' encoding='utf-8'?>
<automationSettings>

<VM name="DE-123" language="de" powerOn="true">
    <vmClients>
        <vmClient name="KO-123" language="ko"/>
                    <vmClient name="US-123" language="en"/>
                    <vmClient name="FR-123" language="fr"/>
    </vmClients>
</VM>

<VM name="ES-123" language="en" powerOn="true">
    <vmClients>
        <vmClient name="IT-123" language="it"/>
        <vmClient name="JA-123" language="ja"/>
    </vmClients>
</VM>

</automationSettings>

我有一个 C# 方法,当 VM 元素具有匹配的名称时,它应该返回 vmClient name 属性的所有值。例如,我想获取 name="DE-123" 的 VM 的 vmClient 名称。这是我尝试过的代码,但它没有返回任何内容。我究竟做错了什么?感谢您提供的任何帮助。

public static void GetClientsList(string systemName)
    {
        systemsFilePath = "text.xml";
        string listOfClients = string.Empty;

        try
        {
            var xdoc = XDocument.Load(systemsFilePath);
            var query = from vm in xdoc.Root.Descendants("VM").Descendants("vmClients").Elements()
                        where vm.Attribute("name").Value == systemName
                        select new
                        {
                            Name = (string)vm.Attribute("name").Value
                        };

            var vms = query.ToList();

            for (int i = 0; i < vms.Count; i++)
            {
                listOfClients += vms[i].Name + " ";
            }

            Global.epoClients = listOfClients;
        }

        catch (Exception ex)
        {
            Console.WriteLine("GetClientsList exception: " + ex.Message);
        }
    }
}

【问题讨论】:

  • 您目前正在vmClients 元素中测试name 属性 - 但name 属性仅在vmClient(单数)或VM 上。

标签: c# xml-parsing linq-to-xml


【解决方案1】:

我怀疑你真的想要:

var query = xdoc.Root.Descendants("VM")
                .Where(vm => (string) vm.Attribute("name") == systemName)
                .Descendants("vmClient")
                .Select(vmClient => (string) vmClient.Attribute("name"));

请注意我们如何测试 VM 元素,而不是 vmClients 元素。

【讨论】:

  • 你的怀疑是正确的,乔恩。那工作得很好。非常感谢您的及时答复。 J.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
相关资源
最近更新 更多