2017-03-02 23 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()只获得直接子代。

相关问题