2017-03-02 60 views
1

根據此XML,請注意BBB存在於兩個節點級別。使用LINQ從相同名稱的集合中排除子節點

<?xml version="1.0" encoding="utf-8"?> 
<AAA> 
    <BBB> 
    <BBB>ONE</BBB> 
    <CCC>1</CCC> 
    <DDD>2</DDD> 
    <EEE>3</EEE> 
    </BBB> 
    <BBB> 
    <BBB>TWO</BBB> 
    <CCC>4</CCC> 
    <DDD>5</DDD> 
    <EEE>6</EEE> 
    </BBB> 
    <BBB> 
    <BBB>THREE</BBB> 
    <CCC>7</CCC> 
    <DDD>8</DDD> 
    <EEE>9</EEE> 
    </BBB> 
</AAA> 

我想獲得的最高級別BBB的集合,並提取到自己的文件,基於內BBB的文件名。

我的代碼是這樣的:

XDocument xdoc = XDocument.Load(sourceFile); 

var lv1s = from lv1 in xdoc.Descendants("AAA") select lv1; 
var lv2s = from lv2 in xdoc.Descendants("BBB") select lv2; 

foreach (var lv2 in lv2s) 
{ 
    var name = lv2.Element("BBB").Value; 
    lv2.Save(@"c:\temp\" + name + ".xml"); 
} 

問題是,LVL2是拿起兩個父母和後代BBB。 似乎無法找到有效過濾後代的方法。

例如,我認爲這是關鍵,但沒有結果:

var lv2s = from lv2 in xdoc.Elements("BBB") select lv2; 

希望你能提供給我一個方法來處理這個問題。

--------------------編輯--------------------

好吧,我明白我做錯了什麼。一個錯字。

LVL2應該利用LVL1,像這樣:

var lv2s = from lv2 in lv1s.Elements("BBB") select lv2; 

也就是說,octavioccl的做法比我想出瞭解決臃腫好得多:

var parentBbbs =xdoc.Element("AAA").Elements("BBB"); 

回答

2

你需要使用Elements方法開始得到根元素,然後選擇父商務改善局:

var parentBbbs =xdoc.Element("AAA").Elements("BBB"); 
+0

感謝的作品。 – flaZer

+0

不客氣,很高興幫助;) – octavioccl

0

只是document.Root .Elements()應該可以工作。

基本上後代()遞歸,而Elements()只獲得直接子代。

相關問題