C#:如何缩短XML附加?

C#:如何缩短XML附加?,c#,.net,xml,C#,.net,Xml,我的XML文件如下所示: <?xml version="1.0" encoding="utf-8"?> <backupatmail> <backup id="0"> <foldername>TestFolder</foldername> <backupdate>09/10/2015</backupdate> <comment>Sample comment text is h

我的XML文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<backupatmail>
  <backup id="0">
    <foldername>TestFolder</foldername>
    <backupdate>09/10/2015</backupdate>
    <comment>Sample comment text is here</comment>
    <numberofparts>7</numberofparts>
    <lastsucceed>Test.007</lastsucceed>
  </backup>
  <backup id="1">
    <foldername>TestFolder2</foldername>
    <backupdate>09/10/2015</backupdate>
    <comment>Sample comment text is here</comment>
    <numberofparts>15</numberofparts>
    <lastsucceed>Test.015</lastsucceed>
  </backup>
</backupatmail>

有没有缩短的方法可以做到这一点,同时保持初学者水平的简单性?

我是如何多次使用visual studio的复制特性生成描述xml结构的类的,在Xml文档中使用System.Xml.Serialization或任何需要的东西时,可以从代码中非常干净、轻松地处理它,并在需要时进行转换


从xml到c#对象的方法相同。

我建议您使用。它有更简单的用于处理XML的API,您的代码如下所示

var file_name = GlobalSettings.appDefaultFolder + "backups.xml";
XDocument xdoc = XDocument.Load(file_name);
var backup999 = new XElement("backup",
    new XAttribute("id", 999),
    new XElement("foldername", "testing1"),
    new XElement("backupdate", "99/99/9999")
    );

xdoc.Root.Add(backup999);
xdoc.Save(file_name);

我个人的偏好是不直接使用XMLAPI。而是使用模型对象,然后对其进行序列化和反序列化。在我看来,它更简洁,一旦通用序列化程序就位,您实际需要的代码就只有3行了

您可以做的是将对象反序列化为实际的“backupatmail”对象,然后调用backupatmail.BackUpItems.Add(此处为新项目),然后将其反序列化为字符串

这种方法比在运行时使用LinqToXml慢,但大多数情况下,额外的毫秒或更长的时间并不是什么大问题

下面是序列化/反序列化代码

    using System.Xml;
    using System.Xml.Serialization;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;

    public class SerializationUtils
    {
        public static T Deserialize<T>(string data)
        {           
            XmlSerializer objSerializer = new XmlSerializer(typeof(T));
            using (var reader = new StringReader(data))
            {
                return (T)objSerializer.Deserialize(reader);
            }
        }

        public static string Serialize<T>(T obj)
        {
            XmlSerializer objSerializer = new XmlSerializer(typeof(T));
            XmlSerializerNamespaces emptyNamespaces = new XmlSerializerNamespaces(new [] { XmlQualifiedName.Empty });

            var settings = new XmlWriterSettings();
            settings.OmitXmlDeclaration = true;
            settings.ConformanceLevel = ConformanceLevel.Auto;
#if DEBUG
            settings.Indent = true;
#else
            settings.Indent = false;
#endif

            using (var stream = new StringWriter())
            using (var writer = XmlWriter.Create(stream, settings))
            {
                objSerializer.Serialize(writer, obj, emptyNamespaces);
                return stream.ToString();
            }
        }
    }
使用System.Xml;
使用System.Xml.Serialization;
使用制度;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用系统文本;
公共类序列化utils
{
公共静态T反序列化(字符串数据)
{           
XmlSerializer objSerializer=新的XmlSerializer(typeof(T));
使用(变量读取器=新的StringReader(数据))
{
返回(T)对象序列化器。反序列化(读取器);
}
}
公共静态字符串序列化(T obj)
{
XmlSerializer objSerializer=新的XmlSerializer(typeof(T));
XmlSerializerNamespaces emptyNamespaces=新的XmlSerializerNamespaces(新[]{XmlQualifiedName.Empty});
var设置=新的XmlWriterSettings();
settings.OmitXmlDeclaration=true;
settings.ConformanceLevel=ConformanceLevel.Auto;
#如果调试
settings.Indent=true;
#否则
settings.Indent=false;
#恩迪夫
使用(var stream=new StringWriter())
使用(var writer=XmlWriter.Create(流、设置))
{
序列化(writer、obj、emptyNamespaces);
返回stream.ToString();
}
}
}
供你使用

string mailItems = GetXmlStringFromSomewhere();
var objMail = SerializationUtils.Deserialize<BackUpMail>(mailItems);
var newItem = new BackUp() { FolderName = "testing1", BackupDate = DateTime.Now};
objMail.BackUpItems.Add(newItem);
var strMailWAddedItem = SerializationUtils.Serialize(objMail);
string mailItems=GetXmlStringFromSomewhere();
var objMail=SerializationUtils.Deserialize(邮件项);
var newItem=newbackup(){FolderName=“testing1”,BackupDate=DateTime.Now};
objMail.BackUpItems.Add(newItem);
var strmailwaddeditime=SerializationUtils.Serialize(objMail);
这是您的实体类

public class BackUpMail
{
    public List<BackUp> BackUpItems {get;set;}
}

public class BackUp
{
 [XmlAttribute("id")]
 public string ID {get;set}

 [XmlElement("foldername")]
 public string FolderName {get;set;}

 [XmlElement("backupdate")]
 public DateTime BackupDate {get;set;}

 [XmlElement("comment")]
 public string Comment {get;set}

 [XmlElement("numberofparts")]
 public string NumberOfParts {get;set}

 [XmlElement("lastsucceed")]
 public string LastSucceed {get;set}
}
公共类备份邮件
{
公共列表备份项{get;set;}
}
公共类备份
{
[XmlAttribute(“id”)]
公共字符串ID{get;set}
[XmlElement(“foldername”)]
公共字符串FolderName{get;set;}
[XmlElement(“反向更新”)]
公共日期时间回溯更新{get;set;}
[XmlElement(“注释”)]
公共字符串注释{get;set}
[XmlElement(“numberofparts”)]
公共字符串NumberOfParts{get;set}
[XmlElement(“lastsucceed”)]
公共字符串{get;set}
}

既然你有了代码,就把它参数化吧

public static void someOtherMethod(){
    XmlDocument doc = new XmlDocument();
    doc.Load(GlobalSettings.appDefaultFolder + "backups.xml");

    // some loop..
      doc.DocumentElement.AppendChild(createNode(id[i], foldername[i], backupdate[i]));

    doc.Save(GlobalSettings.appDefaultFolder + "backups.xml");
}

public static void createNode(string id, string foldername, string backupdate)
{
    XmlElement backupNodeNew = doc.CreateElement("backup");
    XmlAttribute backupId = doc.CreateAttribute("id");
    backupId.Value = id;
    backupNodeNew.Attributes.Append(backupId);

    XmlNode nodeTitle = doc.CreateElement("foldername");
    nodeTitle.InnerText = foldername;

    XmlNode nodeUrl = doc.CreateElement("backupdate");
    nodeUrl.InnerText = backupdate;

    backupNodeNew.AppendChild(nodeTitle);
    backupNodeNew.AppendChild(nodeUrl);
    return backupNodeNew;
}

这要看情况而定。如果您只附加了一个节点,那么谁在乎呢?如果附加1000个节点,可能需要对其进行参数化,或者在此函数中传递整个XmlElement。我需要准备好处理大约200-1000个节点才能添加…回答得很好,谢谢!我在其他地方也有类似的方法,所以在部件代码中有类似的解决方案是干净整洁的:-)
public class BackUpMail
{
    public List<BackUp> BackUpItems {get;set;}
}

public class BackUp
{
 [XmlAttribute("id")]
 public string ID {get;set}

 [XmlElement("foldername")]
 public string FolderName {get;set;}

 [XmlElement("backupdate")]
 public DateTime BackupDate {get;set;}

 [XmlElement("comment")]
 public string Comment {get;set}

 [XmlElement("numberofparts")]
 public string NumberOfParts {get;set}

 [XmlElement("lastsucceed")]
 public string LastSucceed {get;set}
}
public static void someOtherMethod(){
    XmlDocument doc = new XmlDocument();
    doc.Load(GlobalSettings.appDefaultFolder + "backups.xml");

    // some loop..
      doc.DocumentElement.AppendChild(createNode(id[i], foldername[i], backupdate[i]));

    doc.Save(GlobalSettings.appDefaultFolder + "backups.xml");
}

public static void createNode(string id, string foldername, string backupdate)
{
    XmlElement backupNodeNew = doc.CreateElement("backup");
    XmlAttribute backupId = doc.CreateAttribute("id");
    backupId.Value = id;
    backupNodeNew.Attributes.Append(backupId);

    XmlNode nodeTitle = doc.CreateElement("foldername");
    nodeTitle.InnerText = foldername;

    XmlNode nodeUrl = doc.CreateElement("backupdate");
    nodeUrl.InnerText = backupdate;

    backupNodeNew.AppendChild(nodeTitle);
    backupNodeNew.AppendChild(nodeUrl);
    return backupNodeNew;
}