2012-03-11 22 views
0

我有这样一个XML文件:添加/删除XML元素的简单C#代码?

<?xml version='1.0' encoding='utf-8'?> 
<sitegroup name = 'healthcare'> 
     <site name='A' url='a.aspx'/> 
     <site name='B' url='b.aspx'/> 
</sitegroup> 
<sitegroup name = 'diet'> 
     <site name='C' url='c.aspx'/> 
    <site name='D' url='d.aspx'/> 
</sitegroup> 

我是新来的C#。我需要一个简单的代码来在特定的[sitegroup]下插入一个新的[site](由用户输入)(也由用户选择)。如果用户提供的[sitegroup]在XML中不存在,代码应在XML末尾创建一个新的[sitegroup],然后在其中插入新的[site]。

另外,你可以让我知道如何从XML中删除某个[site]或/和整个[sitegroup]吗?

非常感谢。

+1

你可以告诉你试过吗? – 2012-03-11 07:15:43

回答

1

首先你的xml无效。 Xml需要有一个根元素。让我们认为你的根元素是sitegroups。那么你可以在.NET Framework中使用XLinq api

class Program 
{ 
    static void Main(string[] args) 
    { 
     string xml = @"<?xml version='1.0' encoding='utf-8'?> 
<sitegroups> 
<sitegroup name = 'healthcare'> 
     <site name='A' url='a.aspx'/> 
     <site name='B' url='b.aspx'/> 
</sitegroup> 
<sitegroup name = 'diet'> 
     <site name='C' url='c.aspx'/> 
    <site name='D' url='d.aspx'/> 
</sitegroup> 
</sitegroups>"; 

     var doc = XDocument.Parse(xml); 
     XElement siteGroup = doc.Element("sitegroups").Elements().First(e => e.Attribute("name").Value == "healthcare"); 
     var newSite = new XElement("site", new XAttribute("name", "C"), 
              new XAttribute("url", "http://www.google.com")); 
     siteGroup.Add(newSite); 

     Console.WriteLine(doc.ToString()); 
    } 
} 
+0

非常感谢哈桑。它帮了很多:) – 2012-03-11 07:49:35

0

这是最简单的方法是将linq转换为xml。您可能必须将xml结构包装在根元素<sitegroups>中,否则任何解析API可能都不会喜欢它。我还没有运行此代码,但它应该是非常接近:

var sitegroupNameSelectedByUser = "execise"; 
    var siteName = "E"; 
    var siteUrl = "e.aspx"; 

    XDocument yourFile = XDocument.Load(@"yourFilename.xml"); 
    XElement existingSitegroup = xmldoc.XPathSelectElement("sitegroups/sitegroup[@name = sitegroupNameSelectedByUser]"); 

     if (existingSitegroup == null) 
     { 
      XElement sitegroup = new XElement("sitegroup", 
          new XAttribute("name", sitegroupNameSelectedByUser), 
          new XElement("site", 
           new XAttribute("name", siteName), 
           new XAttribute("url", siteUrl)); 

      yourFile.Add(sitegroup); 
     } 

    yourFile.Save("new-filename.xml"); 

要删除您可以选择元素,然后用户Remove()

XDocument yourFile = XDocument.Load(@"yourFilename.xml"); 
XElement existingSitegroup = xmldoc.XPathSelectElement("sitegroups/sitegroup[@name = sitegroupNameSelectedByUser]"); 

if(existingSitegroup != null) 
{ 
    existingSitegroup.Remove(); 
} 

yourfile.Save("new-file.xml"); 
+0

谢谢你dtryon,我会试试这:) – 2012-03-11 07:49:18

0

这里是先检查元素是否存在,以及随后的代码添加子元素:

static XElement FindElementByNameAndAttr(XElement xml, XElement elem) 
    { 
     var q = (from x in xml.Elements() 
       where x.Name == elem.Name 
         && elem.Attributes().All(a => 
          x.Attributes().Any(b => 
          (a.Name == b.Name) && (a.Value == b.Value))) 
       select x) 
       .FirstOrDefault(); 

     return q; 
    } 

    static void Main(string[] args) 
    { 
     string xml1 = 
      @"<?xml version='1.0' encoding='utf-8'?> 
      <root> 
      <sitegroup name = 'healthcare'> 
        <site name='A' url='a.aspx'/> 
        <site name='B' url='b.aspx'/> 
      </sitegroup> 
      <sitegroup name = 'diet'> 
        <site name='C' url='c.aspx'/> 
       <site name='D' url='d.aspx'/> 
      </sitegroup> 
      </root> 
      "; 

     string groupname = "jogging"; // "diet"; 
     string sitename = "K"; 
     string siteurl = "k.aspx"; 

     var root = XElement.Parse(xml1); 

     XElement elem = new XElement("sitegroup", new XAttribute("name", groupname)); 
     XElement foundgroup; 

     if((foundgroup = FindElementByNameAndAttr(root, elem)) == null) 
     { 
      root.Add(elem); 
      foundgroup = elem; 
     } 

     var newsite = new XElement("site", new XAttribute("name", sitename)); 

     XElement foundsite; 
     if ((foundsite = FindElementByNameAndAttr(foundgroup, newsite)) != null) 
     { 
      var attr = foundsite.Attribute("url"); 
      if (attr != null && attr.Value != siteurl) 
      { 
       // error handling here 
       throw new Exception("TODO"); 
      } 
     } 
     else 
     { 
      foundgroup.Add(newsite); 
      foundsite = newsite; 
     } 


     foundsite.SetAttributeValue("url", siteurl); 

     Console.WriteLine(root.ToString()); 
    }