我有一个像这样的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中删除特定的[站点]或/和整个[站点组]吗?
提前多多感谢。
答案 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());
}