Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在xml中添加节点_C#_Xml - Fatal编程技术网

C#在xml中添加节点

C#在xml中添加节点,c#,xml,C#,Xml,我正在尝试为现有代码添加代码。我有以下两个XML: Out.xml <School> <Classes> <Class> <Students> <Student SequenceNumber="1"> <ID>123</ID> <Name>AAA</Name> </Student> </

我正在尝试为现有代码添加代码。我有以下两个XML:

Out.xml

<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
    }
}