嘿我有以下代码将列表中的数据存储到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);
}
当我添加新条目时它只会更改原始条目的格式
答案 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 );