C# 反序列化xml文件时出现问题

C# 反序列化xml文件时出现问题,c#,xml,serialization,uwp,C#,Xml,Serialization,Uwp,我目前正在编写一个UWP应用程序,在反序列化xml文件时遇到了一个问题 我用这段代码成功地序列化了一个对象 private async void button_Click(object sender, RoutedEventArgs e) { Model.Personne user = new Model.Personne(); { user.username = textBox.Text; user.password = p1.Password;

我目前正在编写一个UWP应用程序,在反序列化xml文件时遇到了一个问题

我用这段代码成功地序列化了一个对象

private async void button_Click(object sender, RoutedEventArgs e)
{
    Model.Personne user = new Model.Personne();
    {
        user.username = textBox.Text;
        user.password = p1.Password;
        user.email = textbox1.Text;
        user.address = textBox2.Text;
        var tracker = new Geolocator();
        tracker.DesiredAccuracyInMeters = 5;
        var position = await tracker.GetGeopositionAsync();
        user.Latitude = position.Coordinate.Latitude;
        user.Longitude = position.Coordinate.Longitude;
        user.doesExist = true;
    }
    await SaveToXml(user, "users.xml");

    this.Frame.Navigate(typeof(find_me));
}
public static async Task SaveToXml<T>(T user, string filename)
{
    if (user == null) { return; }

    try
    {
        XmlDocument xmlDocument = new XmlDocument();

        XmlSerializer serializer = new XmlSerializer(user.GetType());
        StorageFolder folder = ApplicationData.Current.LocalFolder;
        // StorageFile file = await folder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
        Stream stream = await folder.OpenStreamForWriteAsync(filename, CreationCollisionOption.OpenIfExists);
        using (MemoryStream str = new MemoryStream())
        {
            serializer.Serialize(stream, user);
            stream.Position = 0;
            xmlDocument.Load(stream);
            XmlNode node = xmlDocument.CreateElement("Personnes");
            xmlDocument.AppendChild(node);
            xmlDocument.Save(stream);
            stream.Dispose();
        }
    }
    catch (Exception ex)
    {
        ex.ToString();
    }
}
private async void按钮\u单击(对象发送方,路由目标)
{
Model.Personne user=新Model.Personne();
{
user.username=textBox.Text;
user.password=p1.密码;
user.email=textbox1.Text;
user.address=textBox2.Text;
var tracker=新地理定位器();
tracker.DesiredAccuracyInMeters=5;
var position=await tracker.GetGeopositionAsync();
user.Latitude=position.Coordinate.Latitude;
user.Longitude=position.Coordinate.Longitude;
user.doesExist=true;
}
等待SaveToXml(用户,“users.xml”);
this.Frame.Navigate(typeof(find_me));
}
公共静态异步任务SaveToXml(T用户,字符串文件名)
{
如果(user==null){return;}
尝试
{
XmlDocument XmlDocument=新的XmlDocument();
XmlSerializer serializer=新的XmlSerializer(user.GetType());
StorageFolder folder=ApplicationData.Current.LocalFolder;
//StorageFile file=wait folder.CreateFileAsync(文件名,CreationCollisionOption.ReplaceExisting);
Stream Stream=wait folder.OpenStreamForWriteAsync(文件名,CreationCollisionOption.OpenIfExists);
使用(MemoryStream str=new MemoryStream())
{
序列化器。序列化(流、用户);
流位置=0;
加载(流);
XmlNode节点=xmlDocument.CreateElement(“人员”);
AppendChild(节点);
xmlDocument.Save(流);
stream.Dispose();
}
}
捕获(例外情况除外)
{
例如ToString();
}
}
但是,当我将对象序列化为xml时,它总是使用
和xmlns属性来序列化对象。
我想删除所有xmlns属性,只保留第一个xml标记。有可能吗?还是应该尝试用JSON序列化

<?xml version="1.0" encoding="utf-8"?>
<Personne xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <username>toto</username>
  <password>tata</password>
  <email>titi</email>
  <address>teuteu</address>
  <Latitude>49.201083564616972</Latitude>
  <Longitude>-0.37977506716400489</Longitude>
  <doesExist>true</doesExist>
</Personne>
<?xml version="1.0" encoding="utf-8"?>
<Personne xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <username>aymann</username>
  <password>vierge</password>
  <email>a.blal@hotmail.fr</email>
  <address>97 rue des Borches</address>
  <Latitude>49.20236710462931</Latitude>
  <Longitude>-0.39321689482623645</Longitude>
  <doesExist>true</doesExist>
</Personne><?xml version="1.0" encoding="utf-8"?>
<Personne xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <username>asalfo</username>
  <password>lolo</password>
  <email>lolo</email>
  <address>lolo</address>
  <Latitude>49.202317469778862</Latitude>
  <Longitude>-0.39308322124621681</Longitude>
  <doesExist>true</doesExist>
</Personne><?xml version="1.0" encoding="utf-8"?>
<Personne xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <username>google</username>
  <password>google</password>
  <email>google</email>
  <address>google</address>
  <Latitude>49.202210566144032</Latitude>
  <Longitude>-0.39300312109158891</Longitude>
  <doesExist>true</doesExist>
</Personne><?xml version="1.0" encoding="utf-8"?>
<Personne xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <username>amadou</username>
  <password>dsfjsmlgkj</password>
  <email>sdklfjsdg</email>
  <address>mfsldkgmljg</address>
  <Latitude>49.202213601881432</Latitude>
  <Longitude>-0.39299270197801961</Longitude>
  <doesExist>true</doesExist>
</Personne>

托托
塔塔
提提
条条鱼
49.201083564616972
-0.37977506716400489
真的
艾曼
维尔奇
A.blal@hotmail.fr
博尔奇街97号
49.20236710462931
-0.39321689482623645
真的
阿萨尔福
洛洛
洛洛
洛洛
49.202317469778862
-0.39308322124621681
真的
谷歌
谷歌
谷歌
谷歌
49.202210566144032
-0.39300312109158891
真的
阿马杜
dsfjsmlgkj
sdklfjsdg
mfsldkgmljg
49.202213601881432
-0.39299270197801961
真的
反序列化的问题是,由于xml标记

这是我的反序列化代码

public static async void reader()
{
    string filename = "users.xml";
    List<Model.Personne> users;
    StorageFolder folder = ApplicationData.Current.LocalFolder;
    Stream stream = await folder.OpenStreamForWriteAsync(filename, CreationCollisionOption.OpenIfExists);
    using (var reader = new StreamReader(stream))
    {
        XmlSerializer deserializer = new XmlSerializer(typeof(List<Model.Personne>),
            new XmlRootAttribute("Personne"));
        users = (List<Model.Personne>)deserializer.Deserialize(reader);

        foreach (var user in users)
        {
            latitude = user.Latitude;
            longitude = user.Longitude;
        }
    }
}
公共静态异步void读取器()
{
字符串filename=“users.xml”;
列出用户名单;
StorageFolder folder=ApplicationData.Current.LocalFolder;
Stream Stream=wait folder.OpenStreamForWriteAsync(文件名,CreationCollisionOption.OpenIfExists);
使用(变量读取器=新的流读取器(流))
{
XmlSerializer反序列化程序=新的XmlSerializer(typeof(List),
新的XmlRootAttribute(“人员”);
用户=(列表)反序列化程序。反序列化(读取器);
foreach(用户中的var用户)
{
纬度=用户纬度;
经度=用户经度;
}
}
}

您可以添加空名称空间和空值
参见我使用的C#扩展方法,例如:

public static string ToXMLString<T>(this T toSerialize)
{
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());

    using (StringWriter textWriter = new StringWriter())
    {
        //Create our own namespaces for the output
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

        //Add an empty namespace and empty value
        //ns.Add("", "http://www.portalfiscal.inf.br/nfe");
        ns.Add("", "");

        xmlSerializer.Serialize(textWriter, toSerialize, ns);
        return textWriter.ToString();
    }
}
publicstaticstring-ToXMLString(这个T-toSerialize)
{
XmlSerializer XmlSerializer=新的XmlSerializer(toSerialize.GetType());
使用(StringWriter textWriter=new StringWriter())
{
//为输出创建我们自己的名称空间
XmlSerializerNamespaces ns=新的XmlSerializerNamespaces();
//添加空命名空间和空值
//添加(“,”http://www.portalfiscal.inf.br/nfe");
加上(“,”);
serializer.Serialize(textWriter,toSerialize,ns);
返回textWriter.ToString();
}
}
例如,您可以将其修改为直接保存到文件


有关反序列化,请参见如果需要处理多个
Personnne
对象,请创建一个列表

List<Model.Personne> personneList = new List<Model.Personne>();
序列化整个列表。此时,将覆盖现有文件

private async void buttonSave_Click(object sender, RoutedEventArgs e)
{
    XmlSerializer serializer = new XmlSerializer(personneList.GetType());
    StorageFolder folder = ApplicationData.Current.LocalFolder;

    using (var stream = await folder.OpenStreamForWriteAsync("users.xml",
        CreationCollisionOption.ReplaceExisting))
    {
        serializer.Serialize(stream, personneList);
    }
}
将数据从文件反序列化到列表

private async void buttonLoad_Click(object sender, RoutedEventArgs e)
{
    XmlSerializer serializer = new XmlSerializer(personneList.GetType());
    StorageFolder folder = ApplicationData.Current.LocalFolder;

    using (var stream = await folder.OpenStreamForReadAsync("users.xml"))
    {
        personneList = (List<Model.Personne>)serializer.Deserialize(stream);
    }
}
private async void按钮加载\单击(对象发送方,RoutedEventArgs e)
{
XmlSerializer serializer=新的XmlSerializer(personList.GetType());
StorageFolder folder=ApplicationData.Current.LocalFolder;
使用(var stream=await folder.OpenStreamForReadAsync(“users.xml”))
{
personneList=(列表)序列化程序。反序列化(流);
}
}

谢谢,我尝试了序列化,它可以转换字符串中的所有标记。现在尝试修复反序列化代码如果有用,请投票。修复反序列化代码需要什么帮助?尝试了u提供的反序列化链接,该链接表示“xml文档第1行位置1处有错误。根级别的数据无效。第1行位置1。”
private async void buttonLoad_Click(object sender, RoutedEventArgs e)
{
    XmlSerializer serializer = new XmlSerializer(personneList.GetType());
    StorageFolder folder = ApplicationData.Current.LocalFolder;

    using (var stream = await folder.OpenStreamForReadAsync("users.xml"))
    {
        personneList = (List<Model.Personne>)serializer.Deserialize(stream);
    }
}