Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Xml中删除元素会在重新加载时破坏格式_C#_Xml_Serialization_Deserialization_Xml Serialization - Fatal编程技术网

C# 从Xml中删除元素会在重新加载时破坏格式

C# 从Xml中删除元素会在重新加载时破坏格式,c#,xml,serialization,deserialization,xml-serialization,C#,Xml,Serialization,Deserialization,Xml Serialization,我正在创建一个存储车辆数据的系统。当我使用Xml序列化来序列化数据时,我得到了正确的格式,如下例所示: <?xml version="1.0"?> <ArrayOfVehicle xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Vehicle>

我正在创建一个存储车辆数据的系统。当我使用Xml序列化来序列化数据时,我得到了正确的格式,如下例所示:

<?xml version="1.0"?>

<ArrayOfVehicle xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <Vehicle>
    <Registration>fake1</Registration>
    <Model>123</Model>
    <Make>test</Make>
    <Year>1999</Year>
    <Cost>100</Cost>
  </Vehicle>

  <Vehicle>
    <Registration>fake2</Registration>
    <Model>321</Model>
    <Make>123</Make>
    <Year>2000</Year>
    <Cost>321</Cost>
  </Vehicle>

</ArrayOfVehicle>
下面是我再次尝试反序列化数据时抛出的错误:

System.invalidoOperationException:'XML文档(10,19)中有错误。XmlException:存在多个根元素。第10行,位置19'.

以下是我的序列化和反序列化方法:

    public static void Retrieve()
    {
        using (FileStream fileStream = new FileStream("C:\\temp\\data.xml", FileMode.OpenOrCreate))
        {
            using (var reader = new StreamReader(fileStream))
            {
                if (fileStream.Length <= 0)
                {
                    return;
                }
                else
                {
                    XmlSerializer deserializer = new XmlSerializer(typeof(List<Vehicle>),
                    new XmlRootAttribute("ArrayOfVehicle"));
                    _vehicleList = (List<Vehicle>)deserializer.Deserialize(reader); //This is where the error is thrown
                }
            }
        }
    }

    public static void Save()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(List<Vehicle>));
        using (FileStream fileStream = new FileStream("C:\\temp\\data.xml", FileMode.Open))
        {
            serializer.Serialize(fileStream, VehicleList);
            fileStream.Close();
        }
    }
publicstaticvoidretrieve()
{
使用(FileStream FileStream=newfilestream(“C:\\temp\\data.xml”,FileMode.OpenOrCreate))
{
使用(var reader=newstreamreader(fileStream))
{

如果(fileStream.Length我认为这是因为您试图反序列化格式错误的xml。请首先确保您的序列化方法生成正确的xml。原因可能是使用
语句关闭
内的流。并且在
for loop
完成之前序列化列表

尝试删除
fileStream.Close();
并将
Business.Save();
移动到循环的
外部


在这里,我使用相同的条件创建了一个文件,它可以工作。

在保存方法中,
新文件流(“C:\\temp\\data.xml”,FileMode.Open)
将打开现有文件而不截断它。因此,在将新的xml数据写入文件后,如果新内容比旧内容短,则旧内容将保留下来


将此更改为新文件流(“C:\\temp\\data.xml”,FileMode.Create)
将解决此问题。

您提到的文件内容(“fake1 123 test 1999 100”)与错误消息不匹配,因为这甚至不是XML。这就是我的意思。当我创建车辆实例并序列化它时,它看起来像XML格式示例。但是当我从列表中删除一个项目并序列化它时,它会删除XML格式并序列化为
“fake1 123 test 1999 100”
XmlSerializer无法生成此输出。不幸的是,您的代码不完整,无法编译。如果您提供一个,那就好了。我真的不知道如何对此做出响应。我所说的就是正在发生的事情。我还测试了一个foreach语句,该语句检查列表中的每个项目。如果该项目存在,我将其从m列表并将其序列化。这仍然会破坏Xml格式,并将其显示为字符串格式而不是Xml格式。我不确定它为什么这样做,但它正在这样做。如果有帮助的话,我可以添加其他东西,如我的类,如vehicle类等,但这对这种情况没有真正的帮助。当我在m中打开Xml文件时,我发现y browser从列表中删除所有项目后,它不显示任何代码。但是如果我检查源代码,它仍然包含数据,但格式略有变化。它将车辆移动到前一行,如下图所示
您能用文本编辑器打开它并将结果粘贴到此处,以便我们可以看到差异吗?我将其添加到底部关于删除而不是,并将其移到rootOk之外的问题,我明白了,请尝试我的建议并再次粘贴生成的xml
    public static void Retrieve()
    {
        using (FileStream fileStream = new FileStream("C:\\temp\\data.xml", FileMode.OpenOrCreate))
        {
            using (var reader = new StreamReader(fileStream))
            {
                if (fileStream.Length <= 0)
                {
                    return;
                }
                else
                {
                    XmlSerializer deserializer = new XmlSerializer(typeof(List<Vehicle>),
                    new XmlRootAttribute("ArrayOfVehicle"));
                    _vehicleList = (List<Vehicle>)deserializer.Deserialize(reader); //This is where the error is thrown
                }
            }
        }
    }

    public static void Save()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(List<Vehicle>));
        using (FileStream fileStream = new FileStream("C:\\temp\\data.xml", FileMode.Open))
        {
            serializer.Serialize(fileStream, VehicleList);
            fileStream.Close();
        }
    }
<?xml version="1.0"?>
<ArrayOfVehicle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Vehicle>
    <Registration>123</Registration>
    <Model>123</Model>
    <Make>23</Make>
    <Year>2000</Year>
    <Cost>123</Cost>
  </Vehicle>
</ArrayOfVehicle><Registration>1321</Registration>
    <Model>123123</Model>
    <Make>312312</Make>
    <Year>2000</Year>
    <Cost>321</Cost>
  </Vehicle>
</ArrayOfVehicle>