[英]Filter XML with dynamic where clause
我有以下XML:
<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或DataTable.Select()的選項,但是由於我對Linq的了解有限,所以我似乎找不到一種簡單的方法來采用這些方法來過濾XML數據。 任何幫助/提示表示贊賞。
因此,您要使用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();
使用LINQ-to-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命名空間非常有用。
完全解析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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.