簡體   English   中英

使用動態where子句過濾XML

[英]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 LinqDataTable.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM