XML持久性多个项目?

时间:2012-12-05 13:38:49

标签: c# xml serialization xml-serialization

嘿我有以下代码将列表中的数据存储到XML文件中,但是当我在列表中添加第二个项目时,它只会用XML覆盖第一个项目,因此XML文件中只有一个项目,我该如何解决这个问题

上课

public class Visits
{
/*
 * This class represents a single appointment
 */

    private string Customer_Name;
    private string Customer_Address;
    private DateTime Arrival_Time;
    private string Visit_Type;
    private Double Lat1;
    private Double Long1;
    //Private methods. Note the use of DateTime to store arrival time

    public string name{
        //Description property
        set { Customer_Name = value; }
        get {return Customer_Name;}
    }

    public string address
    {//Time property
        set { Customer_Address = value; }
        get { return Customer_Address; }
    }

    public DateTime arrival
    {   //Duration property
        set { Arrival_Time = value; }
        get { return Arrival_Time; }
    }

    public string type
    {
        set { Visit_Type = value; }
        get { return Visit_Type; }
    }

    public Double Lat
    {
        //Description property
        set { Lat1 = value; }
        get { return Lat1; }
    }

    public Double Lon1
    {
        //Description property
        set { Long1 = value; }
        get { return Long1; }
    } 
    public override string ToString()
    {   //Return a String representing the object
        return Visit_Type + "     " + Customer_Name + " " + Customer_Address + " " + Arrival_Time.ToString() + " " + "Latitude  " + Lat1 + " " + "Longitude  " + Long1;
    }
}

}

然后是列表

class List
{
/*
 * This object represents the List. It has a 1:M relationship with the Visit class
 */

    private List<Visits> visits = new List<Visits>();
    //List object use to implement the relationshio with Visits

    public void addVisits(Visits vis)
    {
        //Add a new Visit to the List
        visits.Add(vis);
    }

    public List<String> listVisits()
    {//Generate a list of String objects, each one of which represents a Visit in List.

        List<String> listVisits = new List<string>();
        //This list object will be populated with Strings representing the Visits in the lists

        foreach (Visits vis in visits)
        {
            String visAsString = vis.ToString();
            //Get a string representing the current visit object

            listVisits.Add(visAsString);
            //Add the visit object to the List
        }

        return listVisits;
        //Return the list of strings
    }

    public Visits getVisits(int index)
    {
        //Return the visit object at the <index> place in the list

        int count = 0;
        foreach (Visits vis in visits)
        {
            //Go through all the visit objects
            if (index == count)
                //If we're at the correct point in the list...
                return vis;
            //exit this method and return the current visit
            count++;
            //Keep counting
        }
        return null;
        //Return null if an index was entered that could not be found
    }
}

}

然后添加代码

            thePickup.name = txtCustName.Text;
            thePickup.address = txtCustAddress.Text;
            thePickup.arrival = DateTime.Parse(txtArrival.Text);
            thePickup.Dname = txtDeliveryName.Text;
            thePickup.Daddress = txtDaddress.Text;
            thePickup.Lat = Double.Parse(txtLat.Text);
            thePickup.Lon1 = Double.Parse(txtLong.Text);
            thePickup.type = "Pickup";
            //Update thePickup object to reflect any changes made by the user

            XmlSerializer SerializerObj = new XmlSerializer(typeof(Pickups));

        using (TextWriter WriteFileStream = new StreamWriter(@"Pickup.xml", true))
        {
            SerializerObj.Serialize(WriteFileStream, thePickup);
        }

当我添加新条目时它只会更改原始条目的格式

3 个答案:

答案 0 :(得分:0)

您应该尝试使用XPath支持的库来处理XML汇编和创建。

当您使用C#时,我会建议HtmlAgilityPack处理“解析”事情。

为了构建XML,here是学习如何使用XPath的好资源。

您也可以使用C#中的本机XMLDocument类,如果您之前没有任何解析逻辑,那么在您的情况下可能会更有用。

看看here

XPath示例:

这是一个XPath示例,可帮助您避免覆盖XML文件中的实际节点。

CreateTag("//NODE1/NODE2", "TAG_NAME", tagContent);


    private void CreateTag(string xPath, string tag, string tagContent)
    {
        XmlNode node = _xml.SelectSingleNode(xPath);
        XmlElement element = _xml.CreateElement(tag);

        element.InnerText = tagContent;
        node.AppendChild(element);
    }

如果您的集合具有多个具有相同名称的节点:

CreateTag("//SINTEGRA//SEARCH//RECORDS//RECORD[last()]", kv.Key, kv.Value);

其中last()是由大多数.dll实现的XPath方法,它将索引返回到lastnode + 1,以便在最后创建的节点之后插入节点

答案 1 :(得分:0)

试试这个:

using(TextWriter WriteFileStream = new StreamWriter(@"Pickups.xml", true))
{
    SerializerObj.Serialize(WriteFileStream, thePickup);
}

代替。

boolean true参数意味着StreamWriter将append下一个写入现有文件的块,而不是覆盖它

否则,您的代码每次都会覆盖 Pickups.xml 文件。并且不要忘记关闭WriteFileStream对象。

我试图重现你的情况:


    public class Pickups
    {
        public string name { get; set; }
        public string address { get; set; }
        public string Dname { get; set; }
        public string Daddress { get; set; }
        public string type { get; set; }
        public DateTime arrival { get; set; }
        public DateTime Lat { get; set; }
        public DateTime Lon1 { get; set; }
    }

class Program
{


    static void Main()
    {
        Pickups thePickup = new Pickups();
        thePickup.name = "nameProp";
        thePickup.address = "addressProp";
        thePickup.arrival = DateTime.Now;
        thePickup.Dname = "txtDeliveryName";
        thePickup.Daddress = "txtDaddress";
        thePickup.Lat = DateTime.Now;
        thePickup.Lon1 = DateTime.Now;
        thePickup.type = "Pickup";
        //Update thePickup object to reflect any changes made by the user

        XmlSerializer SerializerObj = new XmlSerializer(typeof(Pickups));

        using (TextWriter WriteFileStream = new StreamWriter(@"Pickups.xml", true))
        {
            SerializerObj.Serialize(WriteFileStream, thePickup);
        }

        Pickups thePickup1 = new Pickups();
        thePickup1.name = "nameProp2";
        thePickup1.address = "addressProp2";
        thePickup1.arrival = DateTime.Now;
        thePickup1.Dname = "txtDeliveryName2";
        thePickup1.Daddress = "txtDaddress2";
        thePickup1.Lat = DateTime.Now;
        thePickup1.Lon1 = DateTime.Now;
        thePickup1.type = "Pickup2";

        using (TextWriter WriteFileStream = new StreamWriter(@"Pickups.xml", true))
        {
            SerializerObj.Serialize(WriteFileStream, thePickup1);
        }
    }

}

Pickups.xml 文件中,我得到预期结果(2个实体):

class Program
{


    static void Main()
    {
        Pickups thePickup = new Pickups();
        thePickup.name = "nameProp";
        thePickup.address = "addressProp";
        thePickup.arrival = DateTime.Now;
        thePickup.Dname = "txtDeliveryName";
        thePickup.Daddress = "txtDaddress";
        thePickup.Lat = DateTime.Now;
        thePickup.Lon1 = DateTime.Now;
        thePickup.type = "Pickup";
        //Update thePickup object to reflect any changes made by the user

        XmlSerializer SerializerObj = new XmlSerializer(typeof(Pickups));

        using (TextWriter WriteFileStream = new StreamWriter(@"Pickups.xml", true))
        {
            SerializerObj.Serialize(WriteFileStream, thePickup);
        }

        Pickups thePickup1 = new Pickups();
        thePickup1.name = "nameProp2";
        thePickup1.address = "addressProp2";
        thePickup1.arrival = DateTime.Now;
        thePickup1.Dname = "txtDeliveryName2";
        thePickup1.Daddress = "txtDaddress2";
        thePickup1.Lat = DateTime.Now;
        thePickup1.Lon1 = DateTime.Now;
        thePickup1.type = "Pickup2";

        using (TextWriter WriteFileStream = new StreamWriter(@"Pickups.xml", true))
        {
            SerializerObj.Serialize(WriteFileStream, thePickup1);
        }
    }

}

您确定要修复程序的所有部分吗?也许您在代码中的不同位置写入同一个文件?

答案 2 :(得分:0)

不要序列化单个元素,而是列表:

 List<Pickups> list = new List<Pickups>();

 foreach ( var pickup in ... )
    list.Add( pickup );

 ...
 XmlSerializer SerializerObj = new XmlSerializer(typeof(List<Pickups>));

 TextWriter WriteFileStream = new StreamWriter(@"Pickups.xml");
 SerializerObj.Serialize( WriteFileStream, list );