将XML插入XMLDocument

时间:2015-05-28 21:27:34

标签: c# .net linq linq-to-xml

我的XML如下:

 <School>
   <ClassA>
     <Students>
        <Student>
           <Name>AB</Name>
           <Score>90</Score>
        </Student>
     </Students>
   </ClassA>
 </School>

将XML加载到XmlDocument

  XmlDocument xmlRequest = new XmlDocument();
  xmlRequest.LoadXml(myXML);

现在在LINQ中读取记录数组并动态创建XML

  var xmlSubjects = new XElement("subjects",
                    from c in arrySubjects
                    select new XElement("subject",
                         new XElement("English", c.English),  
                         new XElement("Social", c.Social)
                    ));

从上面我得到的是XML:

     <Subjects>
        <Subject>
           <English>L Author</English>
           <Social>M Author</Social>
        </Subject>
     </Subjects>

我想将这个XML添加到我的Parent XML中。我试过使用下面的代码

    XmlNode xElt = xmlRequest.SelectSingleNode("//ClassA");
    XmlElement xNewChild = xmlRequest.CreateElement(xmlSubjects.ToString());
    xmlRequest.DocumentElement.InsertAfter(xNewChild, xElt);  

我需要帮助将我的XML字符串添加为ClassA的第一个元素。

最终XML:

 <School>
   <ClassA>
     <Subjects>
        <Subject>
           <English>L Author</English>
           <Social>M Author</Social>
        </Subject>
     </Subjects>
     <Students>
        <Student>
           <Name>AB</Name>
           <Score>90</Score>
        </Student>
     </Students>
   </ClassA>
 </School>

请帮助我。

3 个答案:

答案 0 :(得分:1)

我不确定你为什么要在这里混合XmlDocumentXDocument。我会使用XDocument解析原始XML:

var doc = XDocument.Parse(myXML);

然后你可以找到要插入的元素并添加你的新主题:

var classA = doc.Descendants("ClassA").First();
classA.AddFirst(xmlSubjects);

答案 1 :(得分:0)

我不建议将XmlDocumentXDocument API混合在一起,因为生成的代码很难理解和维护,并且由于两种表示之间的转换而可能会出现性能问题。 (也许你被旧版代码限制所包装?)

话虽如此,您可以将XElement xmlSubjects流式传输到XmlNode元素的<ClassA>表示中,如下所示:

        XmlNode xElt = xmlRequest.SelectSingleNode("//ClassA");

        using (var writer = xElt.CreateNavigator().PrependChild())
        using (var reader = xmlSubjects.CreateReader())
        {
            writer.WriteNode(reader, false);
        }

答案 2 :(得分:0)

试试这个:

XmlDocumentFragment xmlfrag = xmlRequest.CreateDocumentFragment();
xmlfrag.InnerXml = xmlSubjects ;
xmlRequest.DocumentElement.InsertAfter(xmlfrag,xmlRequest.DocumentElement.FirstChild);