C# 用c语言解析xml文件#

C# 用c语言解析xml文件#,c#,xml,xml-parsing,xmlreader,C#,Xml,Xml Parsing,Xmlreader,我不明白为什么在解析xml文件时会出错。我有一门课: class FileSignature { public string signature{ get; set; } public string[] extensions{ get; set; } public string description { get; set; } } 我基本上需要通过解析xml文件来填充文件签名列表list:xml文件如下所示: <?xml version="1.0" encodi

我不明白为什么在解析xml文件时会出错。我有一门课:

class FileSignature
{
    public string signature{ get; set; }
    public string[] extensions{ get; set; }
    public string description { get; set; }
}
我基本上需要通过解析xml文件来填充文件签名列表
list
: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>

482B4245445652050726F6475637473204C6963656E7365204B657920466C650000000000000000000000000000000000000000000000000000001A
钥匙
AviraProductKey
FFFE570069006E0064006F00770073002000052006500670069007300700072007900200045006400690074006F0072002000560065007200730069006F006E002000035002E00003000
规则
RegistryDataFile5.00
41565020416E7469766972616C2044617461626173652E202863294B6173706572736B79204C6162203139372D32
AVC
卡巴斯基抗病毒数据库
0000000 2FFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000
雨衣
MacPaintBitmapGraphic
52494646?????415649204C4945354
阿维
视窗音视频交织
464C5601
FLV
FlashVideo
1.
MPG
MPEGVideoFile
465753
主权财富基金
MacromediaFlashFormat
435753
主权财富基金
冲击波冲击(v5+)
FFD8FF
JPG
JPEG/JIFFImage
1F8B08
广州
GZipCompressedArchive
1F9D90
Z
UnixCompressedDarchive
494433
MP3
MP3Audio
FFFB
MP3
MP3Audio
FFFA
MP3
MP3Audio
4D5A
EXE | COM | DLL | SYS
窗口可执行文件
424D
骨形态发生蛋白
WindowsOS/2BitmapGraphics
9501
SKR
PGPPrivateKeyring
9901
PKR
PGPPublicKeyring
我不明白为什么我的代码不起作用。我不希望xml文件按精确顺序排列。换句话说,我想治疗:

  <File>
    <Signature>4D5A</Signature>
    <Extension>EXE|COM|DLL|SYS</Extension>
    <Description>WindowsExecutable</Description>
  </File>

4D5A
EXE | COM | DLL | SYS
窗口可执行文件
就像:

 <File>
    <Description>WindowsExecutable</Description>        
    <Extension>EXE|COM|DLL|SYS</Extension>
    <Signature>4D5A</Signature>
  </File>

窗口可执行文件
EXE | COM | DLL | SYS
4D5A
我解析该xml文件的代码是:
类文件签名
{
公共字符串签名;
公共字符串[]扩展名;
公共字符串说明{get;set;}
}
//这里的构造函数是我开始实现算法的地方
类文件签名
{
公共静态列表文件;
公共文件签名()
{
//列出放置文件的位置
文件=新列表();
//这就是xml所在的路径
XmlTextReader=新的XmlTextReader(@“A:\Users\Tono\Desktop\SaveContentFromCache\SaveContentFromCache\FileSignatures.xml”);
while(reader.Read())
{
//如果我们找到一个file元素,那么
if(reader.Name.ToString().ToLower().Equals(“文件”))
{
//将整个xml放在一个字符串中
string temp=reader.ReadInnerXml().ToString();
//创建一个XmlReader
XmlReader-ReaderOffparent=XmlReader.Create(新建StringReader(临时));
FileSignature f=新文件签名();
while(readerOfParent.Read())/!!!!!!!!!!!!!!!!!!!这就是我得到错误的地方
{
if(readerOfParent.Name.ToString().ToLower()包含(“签名”))
f、 signature=ReaderOffparent.ReadInnerXml().ToString();
if(readerOfParent.Name.ToString().ToLower()包含(“扩展”))
f、 extensions=readerOfParent.ReadInnerXml().ToString().Split(“|”);
if(readerOfParent.Name.ToString().ToLower().Contains(“description”))
f、 description=readerOfParent.ReadInnerXml().ToString();
}
添加(f);
readerOfParent.Close();
}
}
}
}
编辑 阅读我的算法可能会让人困惑。我只需要将xml文件中的内容放入c#

XDocument xdoc=XDocument.Load(@“A:\Users\Tono\Desktop\SaveContentFromCache\SaveContentFromCache\FileSignatures.xml”);
列表文件签名=(来自xdoc.Element(“文件”).Elements(“文件”)中的文件)
选择新文件签名
{
签名=file.Element(“签名”).Value,
扩展名=file.Element(“扩展名”).Value.Split(“|”),
description=file.Element(“description”).Value
}).ToList();

在等待答案的同时,我正在寻找解决方案。我想我应该再试试。不管怎样,我得出的结论如下:

// list where to place the files
Files = new List<FileSignature>();

//Load xml
XDocument xdoc = XDocument.Load(@"A:\Users\Tono\Desktop\SaveContentFromCache\SaveContentFromCache\FileSignatures.xml");

//Run query
var files = from elements in xdoc.Descendants("File")
           select new { 
               Children = elements.Descendants()
           };

//Loop through results
foreach (var elem in files)
{
    FileSignature f = new FileSignature();
    foreach (var lv2 in elem.Children)
    {
        if (lv2.Name.ToString().ToUpper().Contains("SIGNATURE"))
            f.signature = lv2.Value.ToString();
        else if (lv2.Name.ToString().ToUpper().Contains("DESCRIPTION"))
            f.description = lv2.Value.ToString();
        else if (lv2.Name.ToString().ToUpper().Contains("EXTENSION"))
            f.extensions = lv2.Value.ToString().Split('|');              
    }
    Files.Add(f);
}
//列出放置文件的位置
文件=新列表();
//加载xml
XDocument xdoc=XDocument.Load(@“A:\Users\Tono\Desktop\SaveContentFromCache\SaveContentFromCache\FileSignatures.xml”);
//运行查询
var files=来自xdoc.subjects(“文件”)中的元素
选择新{
子元素=元素。子元素()
};
//循环浏览结果
foreach(文件中的变量元素)
{
FileSignature f=新文件签名();
foreach(元素子元素中的变量lv2)
{
if(lv2.Name.ToString().ToUpper()包含(“签名”))
f、 signature=lv2.Value.ToString();
else if(lv2.Name.ToString().ToUpper().Contains(“DESCRIPTION”))
f、 description=lv2.Value.ToString();
else if(lv2.Name.ToString().ToUpper()包含(“扩展”))
f、 extensions=lv2.Value.ToString().Split(“|”);
}
添加(f);
}
编辑 未处理的执行解决方案看起来更简单

stringxml=@"482B4245445652050726F6475637473204C6963656E7365204B657920466C650000000000000000000000000000000000000000000000000000000000000000000000000000001A密钥AviraProductKeyFFFE570069006E0064006F00770073002000052006500670069007300700072007900200045006400690074006F0072002000560065007200730069006F006E002000035002E00030003000注册数据文件5.00 41565020416E7469766972616C20446174616273652E202863294B6173706572736B79204C616220339372D32 AVC卡巴斯基病毒数据库000000
string 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>";

 XDocument doc = XDocument.Parse(xml);
 List<FileSignature> files = (
                     from c in doc.Descendants("File")
                     select new FileSignature 
                     { description=c.Descendants("Description").First().Value,
                       extensions =c.Descendants("Extension").First().Value.Split('|')  ,
                       signature=c.Descendants("Signature").First().Value }
                      ).ToList();
// list where to place the files
Files = new List<FileSignature>();

//Load xml
XDocument xdoc = XDocument.Load(@"A:\Users\Tono\Desktop\SaveContentFromCache\SaveContentFromCache\FileSignatures.xml");

//Run query
var files = from elements in xdoc.Descendants("File")
           select new { 
               Children = elements.Descendants()
           };

//Loop through results
foreach (var elem in files)
{
    FileSignature f = new FileSignature();
    foreach (var lv2 in elem.Children)
    {
        if (lv2.Name.ToString().ToUpper().Contains("SIGNATURE"))
            f.signature = lv2.Value.ToString();
        else if (lv2.Name.ToString().ToUpper().Contains("DESCRIPTION"))
            f.description = lv2.Value.ToString();
        else if (lv2.Name.ToString().ToUpper().Contains("EXTENSION"))
            f.extensions = lv2.Value.ToString().Split('|');              
    }
    Files.Add(f);
}
string 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>";

 XDocument doc = XDocument.Parse(xml);
 List<FileSignature> files = (
                     from c in doc.Descendants("File")
                     select new FileSignature 
                     { description=c.Descendants("Description").First().Value,
                       extensions =c.Descendants("Extension").First().Value.Split('|')  ,
                       signature=c.Descendants("Signature").First().Value }
                      ).ToList();
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

public class FileSignature
{
    public override string ToString()
    {
        return string.Format("Description: '{0}', Extensions: '{1}', Signature: '{2}'"
            , Description
            , string.Join("|", (Extensions ?? new string[0]))
            , Signature
            );
    }

    public string Signature { get; set; }

    [XmlIgnore]
    public string[] Extensions { get; set; }

    [XmlElement(ElementName="Extension")]
    [System.ComponentModel.EditorBrowsable(
        System.ComponentModel.EditorBrowsableState.Never)]
    public string ExtensionsSerialized
    {
        get
        {
            return Extensions == null
                ? ""
                : string.Join("|", Extensions);
        }
        set
        {
            System.Console.WriteLine("Value: {0}", value);
            Extensions = value.Split('|');
        }
    }

    public string Description { get; set; }
}

[XmlRoot("Files")]
public class FileSignatureCollection
{
    public FileSignatureCollection()
    {
        Items = new List<FileSignature>();
    }

    [XmlElement("File")]
    public List<FileSignature> Items { get; set; }
}

class Program
{
    static void Main()
    {
        using(var xml = File.OpenRead("test.xml"))
        {
            var serializer = new XmlSerializer(typeof(FileSignatureCollection));
            var signatures = (FileSignatureCollection)serializer.Deserialize(xml);

            foreach(var sig in signatures.Items)
            {
                System.Console.WriteLine(sig);
            }
        }
    }
}