簡體   English   中英

根據列表從XDocument檢索特定元素

[英]Retrieving specific elements from an XDocument based on a list

我有一個存儲在類中的xml元素列表:

public class clsField
{
    public string fieldName { get; set; }
}

然后我正在加載一個xml文件:

XDocument doc = XDocument.Load(fileName);

最后,我只想將上述類中定義的字段檢索到IEnumerable對象中。 這是我到目前為止的內容:

List<clsField> lstFieldsToProcess;          
IEnumerable<XElement> allthedocs = from thedoc
                 in doc.Descendants("thedocs")
                 select
                 (
                  from fields
                  in lstFieldsToProcess
                  select XElement.Parse(fields.fieldName)
                 );

但是上面的代碼出現錯誤。 任何幫助,將不勝感激。 先謝謝你。

更新#1

偽代碼:

var fieldNames = new HashSet<string>(lstFieldsToProcess.Select(c => c.fieldName));
IEnumerable<XElement> elems = from level1 in doc.Elements("thedocs")
                              let level2 = level1.Descendants()
                              where fieldNames.Contains(level2.Name.LocalName)
                              select level1;

我不太確定您要做什么。 您是否要過濾出具有特定名稱的所有元素,而這是名為“ thedocs”的元素的后代?

假設這是您要執行的操作,則可以執行以下操作:

IEnumerable<XElement> elems = from field in lstFieldsToProcess
                              from de in doc.Elements("thedocs").Descendants(field.fieldName)
                              select de;

// Of course this is the same:
IEnumerable<XElement> elems = lstFieldsToProcess
    .SelectMany(f => doc.Elements("thedocs").Descendants(f.fieldName));

我不確定XDocument的效率如何,所以也許最好先刪除要匹配的字段名(如果性能對您很重要,請進行測試,這是兩者中較好的一個):

var fieldNames = new HashSet<string>(lstFieldsToProcess.Select(c => c.fieldName));
IEnumerable<XElement> elems = from d in doc.Elements("thedocs").Descendants()
                              where fieldNames.Contains(d.Name.LocalName)
                              select d;

更新#1我認為您自己的偽代碼中幾乎都有它。

var fieldNames = new HashSet<string>(lstFieldsToProcess.Select(c => c.fieldName));
IEnumerable<XElement> elems = from level1 in doc.Elements("thedocs")
                              from level2 in level1.Descendants()
                              where fieldNames.Contains(level2.Name.LocalName)
                              select level1;

但是,它可以多次包含相同的“ thedocs”元素(如果它具有多個具有有效字段名的后代)。 為了避免這種情況,只需對結果調用Distint()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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