Pergunta
Eu tenho o seguinte código:
public class DeserializeAndCompare
{
public static List<string> IntoXML()
{
List<string> PopList = new List<string>();
XmlSerializer serializer = new XmlSerializer(PopList.GetType());
string k = FileToolBox.position0;
FileStream filestreamer = new FileStream(k.ToString(), FileMode.Open);
PopList = (List<string>)serializer.Deserialize(filestreamer);
filestreamer.Close();
return PopList;
}
}
Eu manter a bater um erro com a linha: PopList = (List) serializer.Deserialize (filestreamer);
O erro:. InvalidOperationException foi não tratada, há um erro no documento XML (1,1)
Nesta linha: FileStream filestreamer = novo FileStream (k, FileMode.open);
Eu estou tentando fazer referência a posição 0 de uma matriz que contém strings. Basicamente, eu estou passando por meu diretório, encontrar todos os arquivos com uma extensão .xml e segurando os caminhos de nome de arquivo em uma matriz.
Aqui está o código para o meu array:
public static class FileToolBox
{
public static string position0;
public static void FileSearch()
{
//string position0;
//array holding XML file names
string[] array1 = Directory.GetFiles(@"s:\project", "*.xml");
Array.Sort(array1);
Array.Reverse(array1);
Console.WriteLine("Files:");
foreach (string fileName in array1)
{
Console.WriteLine(fileName);
}
position0 = array1[0];
}
public static string Position0
{
get
{
return position0;
}
set
{
position0 = value;
}
}
}
Eu estou faltando alguma coisa aqui? Como faço para me livrar deste erro?
Agradecemos antecipadamente pela ajuda.
Solução
O arquivo XML não está bem formado, use uma ferramenta como o XML Spy, bloco de notas XML ou abri-lo no IE e vai dar-lhe o erro e a linha onde ele está. Você provavelmente tem caracteres inválidos como e em algum lugar do arquivo
Outras dicas
Esse erro é especificamente indicando que o que está sendo lido arquivo XML é mal formado. Você deve começar por publicar a sua XML. Além disso, tente abrir o XML no Firefox, pois pode apontar o problema com o XML também.
O documento XML não está bem formado, você precisa abrir seu arquivo xml-se e analisá-lo.
Existem vários validadores xml na web, mas aqui está um de w3schools .
Dê este um tiro:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace Util
{
/// <summary>
/// Not to be confused with System.Xml.Serialization.XmlSerializer, which this uses internally.
///
/// This will convert the public fields and properties of any object to and from an XML string,
/// unless they are marked with NonSerialized() and XmlIgnore() attributes.
/// </summary>
public class XMLSerializer
{
public static Byte[] GetByteArrayFromEncoding(Encoding encoding, string xmlString)
{
return encoding.GetBytes(xmlString);
}
public static String SerializeToXML<T>(T objectToSerialize)
{
return SerializeToXML(objectToSerialize, Encoding.UTF8);
}
public static String SerializeToXML<T>(T objectToSerialize, Encoding encoding)
{
StringBuilder sb = new StringBuilder();
XmlWriterSettings settings =
new XmlWriterSettings { Encoding = encoding, Indent = true };
using (XmlWriter xmlWriter = XmlWriter.Create(sb, settings))
{
if (xmlWriter != null)
{
new XmlSerializer(typeof (T)).Serialize(xmlWriter, objectToSerialize);
}
}
return sb.ToString();
}
public static void DeserializeFromXML<T>(string xmlString, out T deserializedObject) where T : class
{
DeserializeFromXML(xmlString, new UTF8Encoding(), out deserializedObject);
}
public static void DeserializeFromXML<T>(string xmlString, Encoding encoding, out T deserializedObject) where T : class
{
XmlSerializer xs = new XmlSerializer(typeof(T));
using (MemoryStream memoryStream = new MemoryStream(GetByteArrayFromEncoding(encoding, xmlString)))
{
deserializedObject = xs.Deserialize(memoryStream) as T;
}
}
}
}
public static void Main()
{
List<string> PopList = new List<string>{"asdfasdfasdflj", "asdflkjasdflkjasdf", "bljkzxcoiuv", "qweoiuslfj"};
string xmlString = Util.XMLSerializer.SerializeToXML(PopList);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
string fileName = @"C:\temp\test.xml";
xmlDoc.Save(fileName);
string xmlTextFromFile = File.ReadAllText(fileName);
List<string> ListFromFile;
Util.XMLSerializer.DeserializeFromXML(xmlTextFromFile, Encoding.Unicode, out ListFromFile);
foreach(string s in ListFromFile)
{
Console.WriteLine(s);
}
}
Verifique o arquivo XML de saída e ver o que a codificação é, e que ao comparar o que codificação você está tentando ler. Eu fui pego com este problema antes porque eu usar um StringBuilder para a saída do string XML, que escreve em UTF-16, mas eu estava tentando ler em como UTF-8. Tente usar Encoding.Unicode e ver se isso funciona para você.
O código só funcionará com arquivos XML que têm a seguinte estrutura ...
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>Hello</string>
<string>World</string>
</ArrayOfString>