2012-10-10 121 views
0

另一個屬性值我有一個的XmlNodeList作爲選擇屬性的基礎上的XML

<Fields> 
    <Field FieldId="1" Value="123" FieldTitle="id" FieldType="Text"/> 
    <Field FieldId="2" Value="abc" FieldTitle="First Name" FieldType="Text"/> 
    <Field FieldId="3" Value="efg" FieldTitle="Last Name" FieldType="Text"/> 
</Fields> 

現在我想有什麼價值

var id  = 123 //select the `value` if `FieldId == "1"; 
var firstName = abc //select the `value` if `FieldId == "2"; 
var last name = efg //select the `value` if `FieldId == "3"; 

編輯:我不想循環扔領域,並檢查每個領域,如果條件。

單線解決方案是最受歡迎的。

注:我處理的非常大的XML和Fields是單個節點的一部分,大約有500節點的千田,任何其他更好的解決這個更大的XML文件轉換爲插入查詢是最歡迎

回答

1

你可以有相當不錯的主意,如何完成它通過使用這段代碼:

XDocument doc = XDocument.Load(@"XmlFile1.xml"); 
var elem = doc.Descendants("Field"); 

var id = elem.Where(c => c.Attribute("FieldId").Value.Equals("1")).Select(s => s.Attribute("Value").Value).FirstOrDefault(); 
var firstName = elem.Where(c => c.Attribute("FieldId").Value.Equals("2")).Select(s => s.Attribute("Value").Value).FirstOrDefault(); 
var lastName = elem.Where(c => c.Attribute("FieldId").Value.Equals("3")).Select(s => s.Attribute("Value").Value).FirstOrDefault(); 

一個襯墊的解決方案是不是真的有可能,因爲沒有辦法隔離ID的數據, firstName和lastName在一行代碼中。

新增:

var result = doc.Descendants("Field").Select(s => new { Field = s.Parent.GetHashCode(), FieldId = s.Attribute("FieldId").Value, Value = s.Attribute("Value").Value }); 
foreach (var val in result.GroupBy(g => g.Field).Select(s => s)) 
{ 
    var id = result.Where(c => c.Field == val.Key && c.FieldId == "1").Select(s => s.Value).FirstOrDefault(); 
    var firstName = result.Where(c => c.Field == val.Key && c.FieldId == "2").Select(s => s.Value).FirstOrDefault(); 
    var lastName = result.Where(c => c.Field == val.Key && c.FieldId == "3").Select(s => s.Value).FirstOrDefault(); 
    // ... do something ... 
} 

希望這新添加的代碼能給你一些更好的主意:)

+0

我已經XmlNode的compleat XML是非常大的,就像是'線索\導致[] \場\ fields []'。解析XML後,我在循環中,並具有XML列表作爲領導(列表的領導)現在從每一個領導我需要所有的領域。你的解決方案是好的,但你可以修改它與nodelist一起工作,我喜歡這個方法'elem.Where(c => c.Attribute(「FieldId」)。Value.Equals(「1」))。Select(s => s .Attribute(「Value」)。Value).FirstOrDefault();'但它不適用於一個'xmlNode'對象 – Champ

+0

你可以修改你的問題,只需少量xml的線索\ lead [] \ fields \ fields []並嘗試解釋它有點幫助我詳細瞭解你的要求。 –