根据其他节点的id值创建节点
本文关键字:节点 创建 id 其他 | 更新日期: 2023-09-27 18:22:11
XML文件格式:
<pl>
<afs>
<af id="1"></af>
<af id="2"></af>
</afs>
<pss>
<ps>
<a>
<x afid="1"> </x>
<x afid="2"> </x>
</a>
</ps>
<ps>
<a>
<x afid="2"></x>
</a>
</ps>
</pss>
</pl>
对于所有的afs-child-af节点,我希望在具有Attribute值的父节点a中创建child-x节点。
我使用了以下代码,它只创建空元素。我被这种比较惊呆了,有人能想到这一点吗。这是代码:
if (this.Xml.Descendants("a").Count() > 0) {
var cs = this.Xml.Descendants("a").ToList();
var cCounts = containers.Select(i => i.Elements("x").Count());
var maxCount = containerCounts.Max();
var afIds = from actionField in this.Xml.Descendants("af").Attributes().ToList(); // Here i get compiler error --
foreach (var c in cs)
{
int count = c.Elements("x").Count();
var xList = c.Descendants("x").ToList();
foreach (var xlst in xList)
{
for (int i = count; i < maxCount; i++)
{
c.Add(new XElement("x", new XAttribute("afid", "1"))); // instead 1 I should have correct id value
}
}
}
}
我试图得到的结果是:
<pl>
<afs>
<af id="1"></af>
<af id="2"></af>
</afs>
<pss>
<ps>
<a>
<x afid="1"> </x>
<x afid="2"> </x>
</a>
</ps>
<ps>
<a>
<x afid="1"></x>
<x afid="2"></x>
</a>
</ps>
</pss>
</pl>
问题是没有在新元素上设置属性。使用此方法:
public static void ConformDocument(XDocument doc)
{
var writeElements = doc.Descendants("a").ToList();
if (writeElements.Count == 0)
return;
var root = doc.Descendants("pl");
var ids = (from afs in root.Descendants("afs")
from af in afs.Descendants("af")
from attr in af.Attributes("id")
select attr.Value).Distinct(StringComparer.Ordinal).ToList();
var elements = root
.Descendants("pss")
.Descendants("ps")
.Descendants("a")
.Select(a => new {element = a, aids = a.Descendants("x").Attributes("aid")});
foreach (var e in elements)
{
foreach (var id in ids.Where(id => !e.aids.Any(attr => id.Equals(attr.Value))))
{
var element = new XElement("x");
element.SetAttributeValue("aid", id);
e.element.Add(element);
}
}
}
如果性能出现问题,请告知,我会为您提供一个使用XmlReader
和XmlWriter
的版本。