2011-11-09 38 views
3

我有一個10K記錄的XML數據集,每個記錄包含一組字段。如何執行linq查詢來查找數據集中每個記錄中存在的字段?

我想知道哪些字段需要爲空,哪些可以在與數據集相匹配的數據庫模式中爲非空值。

linq是否提供了生成大交叉路口的方法?

實施例:

<set> 
<item> 
    <a/> 
    <foo /> 
    <b/> 
    <c/> 
</item> 
<item> 
    <a/> 
    <foo /> 
    <b/> 
    <c/> 
    </item> 
<item> 
    <a/> 
    <b/> 
</item> 
<item> 
    <a/> 
    <foo /> 
    <b/> 
    </item> 
</set> 

原型:

string[] CommonFieldNames(XElement[] elements) 
{ 
    // ... 
} 

所需的結果:

{ "a", "b" } 

回答

3

在以下代碼中,selectedValue是您的非空列。

XDocument doc = XDocument.Parse("<set><item><a/><foo /><b/><c/></item><item><a/><foo /><b/><c/></item></set>"); 
var items = 
      doc.Descendants("item") 
      .Select(x=>x.Descendants().Select(y=>y.Name).ToList()).ToList(); 
var selectValue = items[0]; 
foreach (var item in items) 
{ 
    selectValue = selectValue.Intersect(item).ToList(); 
} 
+0

不錯,挺直,謝謝 –

0

你可以使用一個的GroupBy和組的大小比較的元件的總數量:

XDocument doc = XDocument.Parse("<set><item><a/><foo /><b/><c/></item><item><a/><foo /><b/><c/></item><item><a/><b/></item><item><a/><foo /><b/></item></set>"); 
var items = doc.Document.Element("set").Elements("item"); 
var commonElementNames = items.SelectMany(x => x.Elements()) // Get all immediate children 
           .GroupBy(x => x.Name) // Group by name 
           .Where(g => g.Count() == items.Count()) // Filter for only those which show in every group. 
           .Select(g => g.Key.LocalName) // Select just the element names 
           ; 
+0

雖然這不會在你有一個節點下多個子元素的情況下工作(例如「」出現兩次內的「」)。 – Reddog

相關問題