1

根据此 XML,请注意 BBB 存在于两个节点级别。

<?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 和后代 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");
4

2 回答 2

2

您需要开始获取根元素,然后使用Elements方法选择父 BBB:

var parentBbbs =xdoc.Element("AAA").Elements("BBB");
于 2017-03-02T22:15:51.007 回答
0

只是 document.Root.Elements() 应该可以工作。

基本上 Descendants() 递归,而 Elements() 只得到直接的孩子。

于 2017-03-02T22:07:46.110 回答