在C#中通过迭代编写时跳过XML头

时间:2013-11-25 10:43:48

标签: c# xml serialization

我对C#很新,所以如果这个问题很容易回答,我会提前道歉...... 我有一个程序,它创建一些对象并将其属性写入文本文件(.txt)。 从这个文本文件中,它读取包含ID的每隔一行 - 并创建一堆带有这些ID的新对象。

我应该接受这些新对象,将它们添加到List,然后将它们写入XML文件。现在,考虑到我已经放弃尝试将这些对象(以及它们的每个属性)添加到List,因为我无法使其工作,我试图获取这些对象并将它们写入XML。

这是相关的代码:

for (int i = 0; i <= 200; i += 2)
    {

      //Functions of IAnimal take int values so the string needs to be converted.
      int nooID = Convert.ToInt32(animalist[i]);

      //Create a new animal for every iteration and assign it the new ID/name.
      IAnimal nooanimal = new IAnimal();
      nooanimal.setID(nooID);
      nooanimal.setname(nooID);

System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(nooanimal.GetType());

using (StreamWriter streamWriter = System.IO.File.AppendText("animalist.xml"))
{
        serializer.Serialize(streamWriter, nooanimal);
}
}

这很有效,也就是说,它创建了XML文件,它包含了它应该包含的所有元素。然而,它表现得如此:

<?xml version="1.0" encoding="utf-8"?>
<Animal xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ID>300</ID>
  <Name>Animal_300</Name>
</Animal><?xml version="1.0" encoding="utf-8"?>
<Animal xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ID>301</ID>
  <Name>Animal_301</Name>
</Animal>

我无法正确打开它,因为每个对象都会重复标题。 我尝试在for希望写入标题之前创建文件,并且我可以通过迭代填充它,但文件是空的。 我写入文件的方式有什么不对,或者可能是我如何设置有问题的类进行序列化? 谢谢!

2 个答案:

答案 0 :(得分:1)

  1. 创建自定义XmlWriterSettings
  2. 将属性OmitXmlDeclaration设置为true
  3. 使用这些设置创建XmlWriter,然后序列化。

答案 1 :(得分:1)

有效XML文件应仅包含一个根元素。虽然如果删除重复的标头<?xml version="1.0" encoding="utf-8"?>,您的XML文件仍然无效。 试试这个:

List<IAnimal> animals = new List<IAnimal>();
for (int i = 0; i <= 200; i += 2)
{

  //Functions of IAnimal take int values so the string needs to be converted.
  int nooID = Convert.ToInt32(animalist[i]);

  //Create a new animal for every iteration and assign it the new ID/name.
  IAnimal nooanimal = new IAnimal();
  nooanimal.setID(nooID);
  nooanimal.setname(nooID);
  animals.Add(nooanimal);
}

System.Xml.Serialization.XmlSerializer serializer = 
    new System.Xml.Serialization.XmlSerializer(typeof(List<IAnimal>));

using (StreamWriter streamWriter = System.IO.File.AppendText("animalist.xml"))
{
    serializer.Serialize(streamWriter, animals);
}