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.

Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top