使用动态 where 子句筛选 XML
本文关键字:筛选 XML 子句 where 动态 | 更新日期: 2023-09-27 18:33:16
我有以下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 中获取标签名称并构造 where 子句,但这意味着在客户端计算机上添加一些计算,如果可能的话,我想避免这样做。
我已经探索了使用Dynamic Linq或DataTable.Select()的选项,但是由于我对Linq的了解有限,我似乎找不到一种简单的方法来采用这些方法来过滤XML数据。任何帮助/提示不胜感激。
使用 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 命名空间非常有用。
完全解析 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);
所以你想做的是使用 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();