簡體   English   中英

如何獲取這些xml值的字符串數組?

[英]How do I get a string array of these xml values?

我試圖使用linq到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做到這一點嗎?

首先:將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();
}
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();

只是提供另一種選擇...

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<> (當不返回任何資源時),您可以確保hosts永遠不會為空,因此立即使用它總是安全的...

string[] vals = hosts.ToArray();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM