C# 在基于节点的子节点属性值的同级子节点中添加新的子节点
下面是xml文档C# 在基于节点的子节点属性值的同级子节点中添加新的子节点,c#,xml,linq,C#,Xml,Linq,下面是xml文档 <al> <hfs> <hf id="1">A2</hf> ##1) based these hf nodes id attributes <hf id="2">A1</hf> </hfs> <psteps> <pstep> <name>sharepoint</name> <lz
<al>
<hfs>
<hf id="1">A2</hf> ##1) based these hf nodes id attributes
<hf id="2">A1</hf>
</hfs>
<psteps>
<pstep>
<name>sharepoint</name>
<lze>
<lz hid="1"> ##1) in Lze node need to create same number lz nodes
## based previously quoted hf node id attribute
<ps>
<p>
<text>ziel</text>
<inhalt>ttt</inhalt>
</p>
<p>
<text></text>
<inhalt></inhalt>
</p>
</ps>
</lz>
<lz hid="2">
<ps>
<p>
<text></text>
<inhalt></inhalt> ##2) lz node with hid = "2" has 2 p nodes
</p>
<p>
<text></text>
<inhalt></inhalt>
</p>
</ps>
</lz>
</lze>
</pstep>
<pstep>
<name>aspnet</name>
<lze>
<lz hid="2"> ## 1)in Lze node need to create same number lz nodes
## based previously quoted hf node id attribute
<ps>
<p>
<text>ziel</text> ## 2)lz node with hid = "2" has 1 p node so need
<inhalt>ttt</inhalt> ## node to create 1 more as previously
</p> ## lz node
</ps>
</lz>
</lze>
</pstep>
</psteps>
</al>
谢谢你的帮助
这就是你想做的吗
var doc = XDocument.Load("XmlFile1.xml");
var hfIds = (from hf in doc.Descendants("hf").Attributes("id")
select hf.Value).Distinct(StringComparer.Ordinal).ToList();
bool addFlag = true;
foreach (var c in doc.Descendants("lze"))
{
foreach (var hfid in hfIds)
{
addFlag = true;
foreach (var attr in c.Descendants("lz").Attributes("hid"))
{
if (hfid == attr.Value)
{
addFlag = false;
break;
}
}
if (addFlag)
{
c.Add(new XElement("lz", new XAttribute("hid", hfid),
new XElement("ps",
new XElement("p"),
new XElement("Text"),
new XElement("Content"))));
}
}
}
// Adding the p elements to the above added lz elements
var distinctPIds = (from hf in doc.Descendants("lz").Descendants("p")
select hf).GroupBy(x => x.Value).Select(x => x.First()); ;
addFlag = true;
XElement a = null;
foreach (var c in doc.Descendants("lz").Descendants("ps"))
{
foreach (var c3 in distinctPIds)
{
addFlag = true;
foreach (var c2 in c.Descendants("p"))
{
if (XNode.DeepEquals(c2, c3))
{
addFlag = false;
break;
}
a = c3;
}
if (addFlag)
c.Add(a);
}
}
}
代码的格式可能不是最好的。让它更具语言性以便于理解。你好,Sayad,谢谢你的帮助。您的代码似乎没有选择唯一属性
if (xmlDoc.Descendants("a").Count() > 0)
{
var afIds = (from af in xmlDoc.Descendants("af")
from attribute in af.Attributes("Id")
select attribute.Value).Distinct(StringComparer.Ordinal).ToList();
var loContainers = xmlDoc.Descendants("a").Select(a =>
new {element = a, afids = a.Descendants("x").Attributes("afId") });
foreach (var container in loContainers)
{
foreach (var afId in afIds.Where(afId => !container.afids.Any(attr => afId.Equals(attr.Value))))
{
container.element.Add(new XElement("x", new XAttribute("afId", afId),
new XElement("Paragraphs",
new XElement("Paragraph",
new XAttribute("AllowSelection", "false"),
new XElement("Text"),
new XElement("Content")))));
break;
}
}
foreach (var afId in afIds)
{
var distinctlearningObjs = from x in xmlDoc.Descendants("x").Where(
x => (string)x.Attribute("afId").Value == afId).GroupBy(
x => x.Attribute("afId").Value)
select new { MaxParaCount = x.Max(y => y.Descendants("Paragraph").Count ()) };
foreach (var x in distinctlearningObjs)
{
var docLos = from doclo in xmlDoc.Descendants("x").Where(
x => (string)x.Attribute("afId").Value == afId)
select new { doclo, element = doclo.Element("Paragraphs"),
count = doclo.Descendants("Paragraph").Count()
};
foreach (var docLo in docLos)
{
var paraCount = docLo.count;
var maxCount = x.MaxParaCount;
for (var i = paraCount; i < maxCount; i++)
{
docLo.element.Add(new XElement("Paragraph",
new XAttribute("AllowSelection", "false"),
new XElement("Text"),
new XElement("Content")));
}
}
}
}
}
var doc = XDocument.Load("XmlFile1.xml");
var hfIds = (from hf in doc.Descendants("hf").Attributes("id")
select hf.Value).Distinct(StringComparer.Ordinal).ToList();
bool addFlag = true;
foreach (var c in doc.Descendants("lze"))
{
foreach (var hfid in hfIds)
{
addFlag = true;
foreach (var attr in c.Descendants("lz").Attributes("hid"))
{
if (hfid == attr.Value)
{
addFlag = false;
break;
}
}
if (addFlag)
{
c.Add(new XElement("lz", new XAttribute("hid", hfid),
new XElement("ps",
new XElement("p"),
new XElement("Text"),
new XElement("Content"))));
}
}
}
// Adding the p elements to the above added lz elements
var distinctPIds = (from hf in doc.Descendants("lz").Descendants("p")
select hf).GroupBy(x => x.Value).Select(x => x.First()); ;
addFlag = true;
XElement a = null;
foreach (var c in doc.Descendants("lz").Descendants("ps"))
{
foreach (var c3 in distinctPIds)
{
addFlag = true;
foreach (var c2 in c.Descendants("p"))
{
if (XNode.DeepEquals(c2, c3))
{
addFlag = false;
break;
}
a = c3;
}
if (addFlag)
c.Add(a);
}
}
}
if (xmlDoc.Descendants("a").Count() > 0)
{
var afIds = (from af in xmlDoc.Descendants("af")
from attribute in af.Attributes("Id")
select attribute.Value).Distinct(StringComparer.Ordinal).ToList();
var loContainers = xmlDoc.Descendants("a").Select(a =>
new {element = a, afids = a.Descendants("x").Attributes("afId") });
foreach (var container in loContainers)
{
foreach (var afId in afIds.Where(afId => !container.afids.Any(attr => afId.Equals(attr.Value))))
{
container.element.Add(new XElement("x", new XAttribute("afId", afId),
new XElement("Paragraphs",
new XElement("Paragraph",
new XAttribute("AllowSelection", "false"),
new XElement("Text"),
new XElement("Content")))));
break;
}
}
foreach (var afId in afIds)
{
var distinctlearningObjs = from x in xmlDoc.Descendants("x").Where(
x => (string)x.Attribute("afId").Value == afId).GroupBy(
x => x.Attribute("afId").Value)
select new { MaxParaCount = x.Max(y => y.Descendants("Paragraph").Count ()) };
foreach (var x in distinctlearningObjs)
{
var docLos = from doclo in xmlDoc.Descendants("x").Where(
x => (string)x.Attribute("afId").Value == afId)
select new { doclo, element = doclo.Element("Paragraphs"),
count = doclo.Descendants("Paragraph").Count()
};
foreach (var docLo in docLos)
{
var paraCount = docLo.count;
var maxCount = x.MaxParaCount;
for (var i = paraCount; i < maxCount; i++)
{
docLo.element.Add(new XElement("Paragraph",
new XAttribute("AllowSelection", "false"),
new XElement("Text"),
new XElement("Content")));
}
}
}
}
}