2016-09-24 25 views
0

我的XML文件是如何構成的:如何使用LINQ如下執行同步搜索所有子項中

<File> 
<Setting1></Setting1> 
<Setting2></Setting2> 
<Options> 
    <Option> 
     <NameStartsWith>Br</NameStartsWith> 
     <Data>1234</Data> 
    </Option> 
    <Option> 
     <NameStartsWith>Ch</NameStartsWith> 
     <Data>4567</Data> 
</Option> 
</Options> 
</File> 

我想什麼做的是使用LINQ的東西像下面..

String Name = "Brian"; 
if(Name.StartsWith(LINQ.Any.NameStartsWith))) 
{ 
Console.WriteLine("The Answer is: " 1234); 
} 

目前我執行上述循環通過<Option>字段與foreach (XElement xe in Tests)。但真正的XML文件比這更詳細,循環變得難以管理。我最好喜歡使用LINQ來一次搜索所有字段,並使其成爲一個簡單的if或語句。

回答

1

使用LINQ到XML

string name = "Brian"; 
XDocument doc = XDocument.Load(yourXmlFile); 
var matches = doc.Root 
       .Descendants("Option") 
       .Where(option => name.StartsWith(option.Element("NameStartsWith").Value)) 
       .Select(option => option.Element("Data").Value); 

foreach(var data in matches) 
{ 
    Console.WriteLine("The Answer is: {data}"); 
} 

XContainer.Descendants Method (XName)將返回作爲參數傳遞從當前的XElement的所有層次級別名稱的所有元素。

如果元素NameStartsWithOption內是可選的,那麼只需在LINQ方法的鏈中添加檢查null。如果不存在這樣的元素,則XElement.Element(XName name)將返回null

var matches = doc.Root 
       .Descendants("Option") 
       .Where(option => option.Element("NameStartsWith") != null) 
       .Where(option => name.StartsWith(option.Element("NameStartsWith").Value)) 
       .Select(option => option.Element("Data").Value); 

如果Option元件包含需要被選擇的一個以上的其它元素,則創建它們代表所有需要的數據的類和填充它裏面Select方法

public class Option 
{ 
    public string NameStartsWith {get; set; } 
    public string Data {get; set; } 
    public string ElementOne {get; set; } 
    public string ElementTwo {get; set; } 
} 

var matches = doc.Root 
       .Descendants("Option") 
       .Where(option => option.Element("NameStartsWith") != null) 
       .Where(option => name.StartsWith(option.Element("NameStartsWith").Value)) 
       .Select(option => new Option 
       { 
        NameStartsWith = option.Element("Data").Value, 
        Data = option.Element("Data").Value, 
        ElementOne = option.Element("ElementOne").Value, 
        ElementTwo = option.Element("ElementTwo").Value, 
       }); 

當然,你可以使用匿名而不是創建一個。

+0

感謝,它運作良好,除了一個問題。有時在每個「

+0

@JamesNapier - 檢查更新的答案 – Fabio

+0

@JamesNapier這是使用xpath的優勢。它爲你做所有這些檢查...... –

1

XPATH + Linq2Xml也有可能這個

string Name = "Brian"; 
var xDoc = XDocument.Parse(xmlstring); //or XDocument.Load(filename) 
var matches = xDoc 
     .XPathSelectElements($"//Option/NameStartsWith[starts-with('{Name}', text())]"); 
+0

您的路徑將檢查元素NameStartsWith的值以給定名稱開始,但是OP需要元素,其中給定名稱以元素NameStartsWith的值開始 – Fabio

+0

@Fabio不,它按OP期望的那樣工作....即使它錯了,唯一要改變的地方是參數'開始-with'。'text(),'{Name}' –

+1

我的歉意 - 你是對的。 – Fabio