在特定区域中插入节点

时间:2012-11-16 06:04:34

标签: c# xml winforms

<POW>
  <PPE>
    <UID>a1</UID>
    <ppe1Bool></ppe1Bool>
    <ppe1>hello</ppe1>
    <ppe2Bool></ppe2Bool>
    <ppe2></ppe2>
  </PPE>
  <PPE>
    <UID>a3</UID>
    <ppe1Bool></ppe1Bool>
    <ppe1>goodbye</ppe1>
    <ppe2Bool></ppe2Bool>
    <ppe2></ppe2>
  </PPE>
</PWO>

如何在上面的两个父节点之间插入带有子节点的新父节点? 所以它会写着:

<POW>
 <PPE>
   <UID>a1</UID>
   <ppe1Bool></ppe1Bool>
   <ppe1>hello</ppe1>
   <ppe2Bool></ppe2Bool>
   <ppe2></ppe2>
 </PPE>
 <PPE>
   <UID>a2</UID>
   <ppe1Bool></ppe1Bool>
   <ppe1>new insert</ppe1>
   <ppe2Bool></ppe2Bool>
   <ppe2></ppe2>
 </PPE>
 <PPE>
   <UID>a3</UID>
   <ppe1Bool></ppe1Bool>
   <ppe1>goodbye</ppe1>
   <ppe2Bool></ppe2Bool>
   <ppe2></ppe2>
 </PPE>
</PWO>

我有这个:

public static void insertRowBeforRowPPE(string strSelection, string strFileName)
{
 XmlDocument doc = new XmlDocument();

 doc.Load(strFileName);
 XmlNodeList lstNode = doc.SelectNodes("PWO/PPE");
 foreach (XmlNode node in lstNode)
 {
     if (node["UID"].InnerText == strSelection)
     {
          //insert code
     }
 }
 doc.Save(strFileName);
}

strSelection会告诉我在父母身上插入什么孩子......对此有任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

使用LINQ2XML

public static void insertRowBeforRowPPE(string strSelection, string strFileName)
{

    XElement doc=XElement.Load(strFileName);
    foreach(XElement elm in doc.Elements("PPE"))
    {
        if(elm.Element("UID").Value==strSelection)
        elm.AddBeforeSelf(new XElement("PPE",new XElement("UID","a2")));
        //adds PPE node having UID element with value a2 just before the required node
    }
    doc.Save(strFileName);
}

答案 1 :(得分:1)

使用LINQ

在特定节点(Node

之后插入insert after a1
XDocument xDoc = XDocument.Load("data.xml");

xDoc.Element("POW")
     .Elements("PPE").FirstOrDefault(x => x.Element("UID").Value == "a1")
     .AddAfterSelf(new XElement("PPE", new XElement("UID", "A")
                                       , new XElement("ppe1Bool")
                                       , new XElement("ppe1", "hello"), 
                                         new XElement("ppe2Bool"),
                                         new XElement("ppe2")));                

 xDoc.Save("mod.xml");

作为旁注,你的xml似乎没有很好的形成,你需要在使用LINQ之前纠正它。