2013-09-30 62 views
0

我有下面的XML:過濾XML與動態where子句

<Events> 
    <Event> 
     <EventID displayName="Event ID">1</EventID> 
     <EventName displayName="Event Name">Some event</EventName> 
     <OrgID displayName="Organization ID">8</OrgID> 
    </Event> 
    <Event> 
     <EventID displayName="Event ID">2</EventID> 
     <EventName displayName="Event Name">Another Event</EventName> 
     <OrgID displayName="Organization ID">10</OrgID> 
    </Event> 
</Events> 

我希望能夠通過一個where子句動態構造的過濾。例如:

Where("Event ID = 2 AND (Organization ID = 8 OR Organization ID = 10)") 

請注意,我只能使用displayName過濾數據。很明顯,我可以從displayName獲取標籤名稱並構造where子句,但這意味着在客戶機器上添加了一些計算,如果可能的話,我想避免這些計算。

我已經探索了使用Dynamic Linq或的選項,但是由於我對Linq的知識有限,似乎找不到一種簡單的方法來採用這些方法來過濾XML數據。任何幫助/提示表示讚賞。

+0

爲什麼不完全解析xml和將所有元素存儲在一個列表中。這樣你會b能夠輕鬆過濾 – Anirudha

+0

是的,目前這就是我正在做的,但這使我可以使用非常有限的過濾標準,而不是我真正需要的。它不允許我在運行時根據用戶輸入創建where子句。 –

回答

0

所以你想要做的就是使用linq語法從你的xml中獲取數據?

這樣的事情?

XDocument loadedXML = XDocument.Load('Your xml file name'); 
var yourStrongTypeEventsList 
    = (from event in loadedXML.Descendants("Event") 
     where event.Element("EventID").Attribute("displayName").Value.Equals("Your value here") 
     select new 
     {     
      EventID = event.Element("EventID").Value, 
      EventName = event.Element("EventName").Value 
     }).ToList(); 
0

使用LINQ到XML點表示法來提取要素:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Xml.Linq; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string content = @"<Events> 
    <Event> 
     <EventID displayName=""Event ID"">1</EventID> 
     <EventName displayName=""Event Name"">Some event</EventName> 
     <OrgID displayName=""Organization ID"">8</OrgID> 
    </Event> 
    <Event> 
     <EventID displayName=""Event ID"">2</EventID> 
     <EventName displayName=""Event Name"">Another Event</EventName> 
     <OrgID displayName=""Organization ID"">10</OrgID> 
    </Event> 
</Events>"; 

      XDocument doc = XDocument.Load(new System.IO.StringReader(content)); 

      var events = doc.Descendants("Event") 
      .Where(p => p.Elements("EventID").First().Value == "1") 
      .Where(p => p.Elements("OrgID").First().Value == "8" || p.Elements("OrgID").First().Value == "10"); 
     } 
    } 
} 

的System.Xml.Linq的命名空間是非常有用的。

+0

我需要能夠動態地構造where子句作爲字符串。 –

0

解析XML完全

var eventList=doc.Elements("Event") 
       .Select(x=>new 
        { 
         EventId=int.Parse(x.Element("EventId").Value), 
         EventName=x.Element("EventName").Value, 
         OrgID=int.Parse(x.Element("OrgID").Value) 
        }); 

您現在可以做一個通用方法,

public string getEventName(int eventId,params int[] orgId) 
{ 
    return eventList.Where(x=> 
           x.EventId==eventId && 
           orgId.Any(y=>y==x.OrgID)) 
        .Select(x.EventName) 
        .Single(); 

} 

現在你可以做

getEventName(2); 
getEventName(2,8); 
getEventName(2,8,10); 
+0

Typesafe謂詞不起作用,因爲我需要動態創建where子句。我不知道確切的過濾標準,它們是由用戶決定的。 –