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