使用 LINQ 从同名集合中排除子节点
Using LINQ to exclude a Child Node from a collection of the same name
根据这个 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");
只需 document.Root.Elements() 即可。
基本上 Descendants() 是递归的,而 Elements() 只获取直接子项。
您需要开始获取根元素,然后使用 Elements
方法 select 父 BBB:
var parentBbbs =xdoc.Element("AAA").Elements("BBB");
根据这个 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");
只需 document.Root.Elements() 即可。
基本上 Descendants() 是递归的,而 Elements() 只获取直接子项。
您需要开始获取根元素,然后使用 Elements
方法 select 父 BBB:
var parentBbbs =xdoc.Element("AAA").Elements("BBB");