Я не понимаю, почему я получаю ошибки при разборе XML-файла. У меня есть класс:
class FileSignature
{
public string signature{ get; set; }
public string[] extensions{ get; set; }
public string description { get; set; }
}
Мне нужно заполнить список FileSignature List<FileSignature>
, проанализировав xml-файл: xml-файл выглядит следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<Files>
<File>
<Signature>482B424544562050726F6475637473204C6963656E7365204B65792046696C650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001A</Signature>
<Extension>KEY</Extension>
<Description>AviraProductKey</Description>
</File>
<File>
<Signature>FFFE570069006E0064006F0077007300200052006500670069007300740072007900200045006400690074006F0072002000560065007200730069006F006E00200035002E0030003000</Signature>
<Extension>REG</Extension>
<Description>RegistryDataFile5.00</Description>
</File>
<File>
<Signature>41565020416E7469766972616C2044617461626173652E202863294B6173706572736B79204C616220313939372D32</Signature>
<Extension>AVC</Extension>
<Description>KasperskyAnti-VirusDatabase</Description>
</File>
<File>
<Signature>00000002FFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000</Signature>
<Extension>MAC</Extension>
<Description>MacPaintBitmapGraphic</Description>
</File>
<File>
<Signature>52494646????????415649204C495354</Signature>
<Extension>AVI</Extension>
<Description>WindowsAudioVideoInterleave</Description>
</File>
<File>
<Signature>464C5601</Signature>
<Extension>FLV</Extension>
<Description>FlashVideo</Description>
</File>
<File>
<Signature>1</Signature>
<Extension>MPG</Extension>
<Description>MPEGVideoFile</Description>
</File>
<File>
<Signature>465753</Signature>
<Extension>SWF</Extension>
<Description>MacromediaFlashFormat</Description>
</File>
<File>
<Signature>435753</Signature>
<Extension>SWF</Extension>
<Description>ShockwaveFlash(v5+)</Description>
</File>
<File>
<Signature>FFD8FF</Signature>
<Extension>JPG</Extension>
<Description>JPEG/JIFFImage</Description>
</File>
<File>
<Signature>1F8B08</Signature>
<Extension>GZ</Extension>
<Description>GZipCompressedArchive</Description>
</File>
<File>
<Signature>1F9D90</Signature>
<Extension>Z</Extension>
<Description>UNIXCompressedArchive</Description>
</File>
<File>
<Signature>494433</Signature>
<Extension>MP3</Extension>
<Description>MP3Audio</Description>
</File>
<File>
<Signature>FFFB</Signature>
<Extension>MP3</Extension>
<Description>MP3Audio</Description>
</File>
<File>
<Signature>FFFA</Signature>
<Extension>MP3</Extension>
<Description>MP3Audio</Description>
</File>
<File>
<Signature>4D5A</Signature>
<Extension>EXE|COM|DLL|SYS</Extension>
<Description>WindowsExecutable</Description>
</File>
<File>
<Signature>424D</Signature>
<Extension>BMP</Extension>
<Description>WindowsOS/2BitmapGraphics</Description>
</File>
<File>
<Signature>9501</Signature>
<Extension>SKR</Extension>
<Description>PGPPrivateKeyring</Description>
</File>
<File>
<Signature>9901</Signature>
<Extension>PKR</Extension>
<Description>PGPPublicKeyring</Description>
</File>
</Files>
и я не понимаю, почему мой код не работает. Я не хочу, чтобы XML-файл был в точном порядке. Другими словами, я хочу лечить:
<File>
<Signature>4D5A</Signature>
<Extension>EXE|COM|DLL|SYS</Extension>
<Description>WindowsExecutable</Description>
</File>
просто как:
<File>
<Description>WindowsExecutable</Description>
<Extension>EXE|COM|DLL|SYS</Extension>
<Signature>4D5A</Signature>
</File>
и мой код для разбора этого XML-файла:
class FileSignature
{
public string signature;
public string[] extensions;
public string description { get; set; }
}
// Constructor here is where I start implementing the algorithm
class FileSignatures
{
public static List<FileSignature> Files;
public FileSignatures()
{
// list where to place the files
Files = new List<FileSignature>();
// that is the path where the xml is located
XmlTextReader reader = new XmlTextReader(@"A:\Users\Tono\Desktop\SaveContentFromCache\SaveContentFromCache\FileSignatures.xml");
while (reader.Read())
{
// if we find a file element then
if (reader.Name.ToString().ToLower().Equals("file"))
{
// place that entire xml in a string
string temp = reader.ReadInnerXml().ToString();
// Create an XmlReader
XmlReader readerOfParent = XmlReader.Create(new StringReader(temp));
FileSignature f = new FileSignature();
while (readerOfParent.Read()) // !!!!!!!!!!!! here is where I get the error
{
if (readerOfParent.Name.ToString().ToLower().Contains("signature"))
f.signature = readerOfParent.ReadInnerXml().ToString();
if (readerOfParent.Name.ToString().ToLower().Contains("extension"))
f.extensions = readerOfParent.ReadInnerXml().ToString().Split('|');
if (readerOfParent.Name.ToString().ToLower().Contains("description"))
f.description = readerOfParent.ReadInnerXml().ToString();
}
Files.Add(f);
readerOfParent.Close();
}
}
}
}
EDIT
Чтение моего алгоритма может показаться запутанным. Мне просто нужно поместить содержимое из XML-файла в C #