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)

Program/Files が存在しない場合、 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を使用して、どのレジストリ キーがいつアクセスされているかを確認できます (コードを 1 ステップ実行し、Process Monitor がレポートするレジストリ アクセスを確認します)。

于 2013-01-22T14:15:40.083 に答える