0

我有以下 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 LinqDataTable.Select()的选项,但由于我对 Linq 的了解有限,我似乎无法找到一种简单的方法来采用这些选项来过滤 XML 数据。任何帮助/提示表示赞赏。

4

3 回答 3

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);
于 2013-09-30T12:52:01.113 回答
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();
于 2013-09-30T12:44:14.253 回答
0

使用 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 命名空间非常有用。

于 2013-09-30T12:46:24.577 回答