質問
次のコードがあります:
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 =(リスト)serializer.Deserialize(filestreamer);
エラー:InvalidOperationExceptionが処理されませんでした、XMLドキュメント(1,1)にエラーがあります。
この行では: FileStream filestreamer = new 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;
}
}
}
ここに何かがありませんか?このエラーを取り除くにはどうすればよいですか?
助けてくれてありがとう。
解決
XMLファイルの形式が正しくありません。XMLSpy、XMLメモ帳などのツールを使用するか、IEで開いてください。エラーとその行が表示されます。おそらく&amp;のような無効な文字があります。ファイルのどこか
他のヒント
このエラーは、読み取られているXMLファイルの形式が正しくないことを具体的に示しています。 XMLを投稿することから始めてください。また、FirefoxでXMLを開いてみてください。XMLの問題も指摘されている可能性があります。
XMLドキュメントの形式が正しくありません。xmlファイルを開いて分析する必要があります。
Webには複数のxmlバリデーターがありますが、これは w3schools のものです。
これを試してみましょう:
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ファイルを確認し、エンコーディングが何であるかを確認し、それを読み取りしようとしているエンコーディングと比較します。 UTF-16ですが、UTF-8として読み込もうとしていました。 Encoding.Unicodeを使用してみて、それが機能するかどうかを確認してください。
コードは、次の構造を持つ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>