用于添加/删除XML元素的简单C#代码?

时间:2012-03-11 07:11:59

标签: c# .net xml

我有一个像这样的XML文件:

<?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中删除特定的[站点]或/和整个[站点组]吗?

提前多多感谢。

3 个答案:

答案 0 :(得分: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());
    }
}

答案 1 :(得分: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");

答案 2 :(得分: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());
    }