0

当我尝试使用 C# 和 XMLDocument 解析示例 XML 文件时,它会抛出 IO.IOException 并说它没有找到注册表项。您可以在此处找到示例 XML 文件。(这是我在 InfoFileURL 中提供该工具的链接。有人解决了这个问题吗?

xmlDoc.Load(InfoFileURL);

if (xmlDoc.SelectSingleNode("Program/Files").HasChildNodes) // IOException
{
     foreach (XmlNode node in xmlDoc.SelectNodes("Program/Files/File"))
     {
         if (int.Parse(node.Attributes["Date"].Value) > VersionOld)
         {
              NewFile newfile = new NewFile();
              newfile.FilePath = node.Attributes["Path"].Value;
              newfile.Hash = node.Attributes["Hash"].Value;
              newfile.Date = int.Parse(node.Attributes["Date"].Value);
              newfile.WebPath = node.InnerText;

              NewFiles.Add(newfile);
          }
     }
}

---------------------------------------------------------------------------------
Exception Detail:

  System.IO.IOException ist aufgetreten.
  HResult=2
  Message=Der angegebene Registrierungsschlüssel ist nicht vorhanden.
  Source=mscorlib
  StackTrace:
       bei Microsoft.Win32.RegistryKey.Win32Error(Int32 errorCode, String str)
 InnerException: 

---------------------------------------------------------------------------------
XML-File:
http://neolegends.tk/programs/test/updates.xml

<Program>
   <Changes>
       <Change Date="20130111">Heyo Mofo</Change>
   </Changes>
   <Files>
       <File Date="20130111" Hash="977d6a6c1028c1dff3b0a1a7e1604d033b7a14a7" Path="ni94512_1_DB.7z">http://neolegends.tk/programs/test/data/ni94512_1_DB.7z</File>
       <File Date="20130111" Hash="ef520d82094153930247b0d75144b77bee6e40ea" Path="Osmos.sta">http://neolegends.tk/programs/test/data/Osmos.sta</File>
   </Files>
   <Deletions>
       <Deletion Date="20130111">HITMÄN.mp3</Deletion>
   </Deletions>
</Program>
4

1 回答 1

0

在 XmlDocument 中选择时不应抛出 IOException。线

if (xmlDoc.SelectSingleNode("Program/Files").HasChildNodes)

是不必要的,因为如果程序/文件不存在,foreach 将不会做任何事情。此外,如果 xmlDoc.SelectSingleNode("Program/Files") 返回 null,您将在 HasChildNodes 属性上获得 null 引用异常。

尝试在 xpath 前加上“/”:

foreach (XmlNode node in xmlDoc.SelectNodes("/Program/Files/File"))

这将从根节点中选择。或以“//”为前缀以选择 xml 中的任何位置:

foreach (XmlNode node in xmlDoc.SelectNodes("//Program/Files/File"))

编辑:您的代码不应访问注册表。您确定上面显示的代码引发了异常吗?您可以使用Process Monitor查看正在访问哪些注册表项以及何时访问(通过单步执行代码并查看 Process Monitor 报告的注册表访问权限)。

于 2013-01-22T14:15:40.083 回答