Ошибка в моем XML? - PullRequest
       1

Ошибка в моем XML?

1 голос
/ 16 июня 2009

У меня есть следующий код:

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;

    }
}

Я продолжаю сталкиваться с ошибкой в ​​строке: PopList = (List) serializer.Deserialize (filestreamer);

Ошибка: InvalidOperationException не обработан, есть ошибка в XML-документе (1,1).

В этой строке: FileStream filestreamer = новый FileStream (k, FileMode.open);

Я пытаюсь сослаться на 0-ю позицию массива, содержащего строки. Я в основном просматриваю свой каталог, нахожу любые файлы с расширением .xml и храню пути к именам файлов в массиве.
Вот код для моего массива:

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;
        }

    }
    }

Я что-то здесь упускаю? Как мне избавиться от этой ошибки?

Заранее спасибо за помощь.

Ответы [ 5 ]

3 голосов
/ 16 июня 2009

Ваш XML-файл неправильно сформирован, используйте такой инструмент, как XML Spy, XML notepad или откройте его в IE, и он выдаст ошибку и строку, в которой он находится. Скорее всего, у вас есть недопустимые символы, такие как & где-то в файле

1 голос
/ 16 июня 2009

Ваш xml-документ плохо сформирован, вам нужно открыть и проанализировать xml-файл.

В сети есть несколько валидаторов xml, но вот один из w3schools .

1 голос
/ 16 июня 2009

Эта ошибка конкретно указывает на то, что читаемый файл XML искажен. Вы должны начать с публикации вашего XML. Кроме того, попробуйте открыть XML в Firefox, потому что это может указать на проблему и с XML.

0 голосов
/ 16 июня 2009

Ваш код будет работать только с файлами XML, имеющими следующую структуру ...

<?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>
0 голосов
/ 16 июня 2009

Дайте этому шанс:

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);
    }
}

Проверьте выходной файл XML и посмотрите, что такое кодировка, и сравните ее с той кодировкой, в которой вы пытаетесь прочитать. Раньше я сталкивался с этой проблемой, потому что я использую StringBuilder для вывода строки XML, которая записывает в UTF-16, но я пытался читать как UTF-8. Попробуйте использовать Encoding.Unicode и посмотрите, подходит ли вам это.

...