【问题标题】:How do I get a string array of these xml values?如何获取这些 xml 值的字符串数组?
【发布时间】:2013-04-05 20:26:20
【问题描述】:

我试图使用 linq to xml,但我对它很陌生。

这是xml:

<BrandHosts>
  <Brand>
    <ResourceName>BrandInfo_AAA</ResourceName>
    <Hosts>
      <Host>www.aaa.com</Host>
      <Host>portal.aaa.com</Host>
      <Host>aaa.com</Host>
    </Hosts>
  </Brand>
  <Brand>
    <ResourceName>BrandInfo_BBB</ResourceName>
    <Hosts>
      <Host>www.bbb.com</Host>
      <Host>bbb.com</Host>
      <Host>portal.bbb.com</Host>
    </Hosts>
  </Brand>
  <Brand>
    <ResourceName>BrandInfo_CCC</ResourceName>
    <Hosts>
      <Host>www.CCC.com</Host>
    </Hosts>
  </Brand>
  <Brand>
    <ResourceName>BrandInfo_DDD</ResourceName>
    <Hosts>
      <Host>www.DDD.com</Host>
    </Hosts>
  </Brand>
</BrandHosts>

我将有一个字符串值,其中包含我需要从这个 xml 中提取的资源名称。例如,我的参数可能是“BrandInfo_BBB”。而且我需要返回一个包含该块中所有主机的字符串数组。我可以用 linq to xml 做到这一点吗?

【问题讨论】:

    标签: c# .net xml linq-to-xml


    【解决方案1】:

    首先:将您的 XML 加载到 XDocument 对象中并准备结果变量:

    var doc = XDocument.Load("Input.txt");
    string[] hosts;
    

    然后就可以查询文档了。 我假设 ResourceName 在输入 XML 中是唯一的

    var resourceName = "BrandInfo_DDD";
    
    var brand = doc.Root.Elements("Brand").SingleOrDefault(b => (string)b.Element("ResourceName") == resourceName);
    
    if (brand != null)
    {
        hosts = brand.Element("Hosts")
                     .Elements("Host")
                     .Select(h => (string)h)
                     .ToArray();
    }
    

    对于非唯一的ResourceName

    var brands = doc.Root.Elements("Brand").Where(b => (string)b.Element("ResourceName") == resourceName).ToArray();
    
    string[] hosts;
    
    if (brands.Length > 0)
    {
        hosts = brands.SelectMany(b => b.Element("Hosts")
                                        .Elements("Host")
                                        .Select(h => (string)h)
                                        ).ToArray();
    }
    

    【讨论】:

      【解决方案2】:
      string toSearch = "BrandInfo_BBB";
      
      XDocument xDoc = XDocument.Load("XMLFile1.xml");
      
      
      string[] strArr = xDoc.Descendants("Brand").Where(n => n.Element("ResourceName").Value == toSearch).Single()
                            .Descendants("Host").Select(h => h.Value).ToArray();
      

      【讨论】:

      • 这比它应该的要长。一开始我在尝试Descendants("ResourceName"),这是错误的
      【解决方案3】:

      只是提供另一种选择......

      XDocument doc = XDocument.Load("BrandHosts.xml");
      string resourceName = "BrandInfo_DDD";
      
      var resources = doc
          .Descendants("Brand")
          .Where(n => n.Element("ResourceName").Value == resourceName);
      
      var hosts = resources.Any() ?
          resources.Descendants("Host").Select(h => h.Value) :
          Enumerable.Empty<string>();
      

      通过使用上面的Enumerable.Empty&lt;&gt;(当没有资源返回时),您可以确保hosts 永远不会为空,因此立即使用它总是安全的......

      string[] vals = hosts.ToArray();
      

      【讨论】:

        猜你喜欢
        • 2019-11-16
        • 2022-10-12
        • 2019-07-17
        • 1970-01-01
        • 2014-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多