0

嘿,我有以下代码将列表中的数据存储到 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);
        }

当我添加一个新条目时它只是改变了原始条目的格式

4

3 回答 3

0

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

当您使用 C# 时,我会推荐HtmlAgilityPack来处理“解析”的事情。

为了构建 XML,这里是学习如何使用 XPath 构建 XML 的一个很好的来源。

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

看看这里

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);

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

于 2012-12-05T13:44:46.273 回答
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 );
于 2012-12-05T13:54:37.893 回答
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 个实体):

<?xml version="1.0" encoding="utf-8"?>
<Pickups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <name>nameProp</name>
  <address>addressProp</address>
  <Dname>txtDeliveryName</Dname>
  <Daddress>txtDaddress</Daddress>
  <type>Pickup</type>
  <arrival>2012-12-05T15:30:37.809487+01:00</arrival>
  <Lat>2012-12-05T15:30:37.810487+01:00</Lat>
  <Lon1>2012-12-05T15:30:37.810487+01:00</Lon1>
</Pickups><?xml version="1.0" encoding="utf-8"?>
<Pickups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <name>nameProp2</name>
  <address>addressProp2</address>
  <Dname>txtDeliveryName2</Dname>
  <Daddress>txtDaddress2</Daddress>
  <type>Pickup2</type>
  <arrival>2012-12-05T15:30:37.989487+01:00</arrival>
  <Lat>2012-12-05T15:30:37.989487+01:00</Lat>
  <Lon1>2012-12-05T15:30:37.989487+01:00</Lon1>
</Pickups>

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

于 2012-12-05T13:47:15.820 回答