C#在xml中添加节点
我正在尝试为现有代码添加代码。我有以下两个XML: Out.xmlC#在xml中添加节点,c#,xml,C#,Xml,我正在尝试为现有代码添加代码。我有以下两个XML: Out.xml <School> <Classes> <Class> <Students> <Student SequenceNumber="1"> <ID>123</ID> <Name>AAA</Name> </Student> </
<School>
<Classes>
<Class>
<Students>
<Student SequenceNumber="1">
<ID>123</ID>
<Name>AAA</Name>
</Student>
</Students>
</Class>
</Classes>
</School>
<School>
<Classes>
<Class>
<Students>
<Student SequenceNumber="1">
<ID>456</ID>
<Name>BBB</Name>
</Student>
<Student SequenceNumber="2">
<ID>123</ID>
<Name>AAA</Name>
</Student>
<Student SequenceNumber="3">
<ID>789</ID>
<Name>CCC</Name>
</Student>
</Students>
</Class>
</Classes>
</School>
<School>
<Classes>
<Class>
<Students>
<Student SequenceNumber="1">
<ID>123</ID>
<Name>AAA</Name>
</Student>
<Student SequenceNumber="2">
<ID>456</ID>
<Name>BBB</Name>
</Student>
<Student SequenceNumber="3">
<ID>789</ID>
<Name>CCC</Name>
</Student>
</Students>
</Class>
</Classes>
</School>
我不能改变以上代码,现在我需要添加我的逻辑
我加了如下
string xpath = @"/m:School/m:Classes/m:Class/m:Students";
XmlNodeList outStudentNodes = targetXmlDoc.SelectNodes(xpath + "/m:Student", namespaceManager);
if(outStudentNodes== null || outStudentNodes.Count <= 0)
{
return;
}
XElement root = sourceXmlDoc.Root;
IEnumerable<XElement> inStudentsColl = from item in root.Elements("Classes").Descendants("Class")
.Descendants("Students").Descendants("Student")
select item;
这会将这两个集合投影到一个匿名对象列表中,进行比较,并为您提供一组尚不存在的匿名对象,您可以通过这些匿名对象添加到输出XML中
public static List<object> GetInStudents(XDocument sourceXmlDoc)
{
IEnumerable<XElement> inStudentsElements =
sourceXmlDoc.Root.Elements("Classes").Descendants("Class")
.Descendants("Students").Descendants("Student");
return inStudentsElements.Select(i =>
new { Id = i.Elements().First().Value,
Name = i.Elements().Last().Value }).Cast<object>().ToList();
}
public static List<object> GetOutStudents(XmlDocument targetXmlDoc)
{
XmlNodeList outStudentsElements = targetXmlDoc.GetElementsByTagName("Students")[0].ChildNodes;
var outStudentsList = new List<object>();
for (int i = 0; i < outStudentsElements.Count; i++)
{
outStudentsList.Add(new { Id = outStudentsElements[i].ChildNodes[0].InnerText,
Name = outStudentsElements[i].ChildNodes[1].InnerText });
}
return outStudentsList;
}
用谷歌搜索这个并不难:我没有看到任何与你的问题相关的代码。。。。。只需编写存放xml文件的代码。。。。你尝试过什么吗?为什么你要以不同的方式阅读它们(XDocument和XmlDocument)?@Mano。。我添加了代码。从Out.xml我可以读入XmlNodeList,从In.xml我可以读入IEnumerable。现在我想知道,我们是否可以使用LINQ语句来进行比较,而不是foreach/for循环,并获取in.xml中但不在Out.xml中的元素列表,这样我就可以将它们添加回Out.xml。我现在正在编写一些代码,稍后将在回答中发布。@TheAnatheme。。您能告诉我如何读取foreach循环中元素内部的数据吗。。。在这之前,它正是我想要的…我需要在元素中获取数据。。创建节点并添加到XmlDocument…@Ziggler只需键入element.Id或element.Name。将其添加到XmlDocument时,必须获取最后一个SequenceNumber,向其中添加一个,然后在添加时递增。这超出了你原来的问题,Stack Overflow不是做作业的网站。剩下的事你得做。@Theanateme。。我明白了…我就是这样做的…DynamicNewsTudenElement=元素是动态的;字符串newStudentId=newStudentElement.ID;字符串newStudentName=newStudentElement.Name。。我将发布我的完整解决方案,一旦我的任务完成。。。非常感谢你。。你的回答真的为我指明了正确的方向。。。我将此标记为答案。。。
string xpath = @"/m:School/m:Classes/m:Class/m:Students
XmlNode studentsNode = targetXmlDoc.SelectSingleNode(xpath, namespaceManager);
foreach (var element in elementsToAdd)
{
//Add Microsoft.CSharp.dll (if needed ) to your project for below statement to work
dynamic studentElement = element as dynamic;
if (studentElement != null)
{
XmlElement studentXmlElement = targetXmlDoc.CreateElement("Student");
XmlElement studentIDXmlElement = targetXmlDoc.CreateElement("ID");
studentIDXmlElement.InnerText = studentElement.ID;
XmlElement studentNameXmlElement = targetXmlDoc.CreateElement("Name");
studentNameXmlElement .InnerText = studentElement.Name;
studentXmlElement.AppendChild(studentIDXmlElement);
studentXmlElement.AppendChild(studentNameXmlElement);
studentsNode.AppendChild(childElement);
}
}
public static List<object> GetInStudents(XDocument sourceXmlDoc)
{
IEnumerable<XElement> inStudentsElements =
sourceXmlDoc.Root.Elements("Classes").Descendants("Class")
.Descendants("Students").Descendants("Student");
return inStudentsElements.Select(i =>
new { Id = i.Elements().First().Value,
Name = i.Elements().Last().Value }).Cast<object>().ToList();
}
public static List<object> GetOutStudents(XmlDocument targetXmlDoc)
{
XmlNodeList outStudentsElements = targetXmlDoc.GetElementsByTagName("Students")[0].ChildNodes;
var outStudentsList = new List<object>();
for (int i = 0; i < outStudentsElements.Count; i++)
{
outStudentsList.Add(new { Id = outStudentsElements[i].ChildNodes[0].InnerText,
Name = outStudentsElements[i].ChildNodes[1].InnerText });
}
return outStudentsList;
}
var inStudents = GetInStudents(sourceXmlDoc);
var outStudents = GetOutStudents(targetXmlDoc);
if (inStudents.SequenceEqual(outStudents))
{
return;
}
else
{
var elementsToAdd = inStudents.Except(outStudents);
foreach (var element in elementsToAdd)
{
// create xmlNode with element properties, add element to xml
}
}