2011-12-10 16 views
21

XML文書(画像が添付されている)にルート要素があると誰かが "ルート要素が見つかりません"その目からレイザーを発射する。「ルート要素がありません」というエラーが発生しましたが、ルート要素があります

enter image description here

コード:

if (ISF.FileExists("Players.xml")) 
{ 
    string xml; 
    using (IsolatedStorageFileStream rawStream = ISF.OpenFile("Players.xml", FileMode.Open)) 
    { 
     StreamReader reader = new StreamReader(rawStream); 
     xml = reader.ReadToEnd(); 
      XmlReaderSettings settings = new XmlReaderSettings { IgnoreComments = true, IgnoreWhitespace = true }; 
     XmlReader xmlReader = XmlReader.Create(reader, settings); 
     while (xmlReader.Read()) 
     { 
      switch (xmlReader.NodeType) 
      { 
       case XmlNodeType.Element: 
        switch (xmlReader.Name) 
        { 
         case "numberOfPlayers": 
          string nodeValue = xmlReader.ReadContentAsString(); 
          int NODEVALUE = int.Parse(nodeValue); 
          MessageBox.Show(" " + NODEVALUE); 
          break; 
        } 
        break; 
      } 
      break; 
     } 
     reader.Close(); 
    } 
} 
+1

タグは各タグは、あなたがここに 'XmlReader'を使用している特定の理由...質問に – mtahmed

+0

をトピックを特定しなければならない...あなたがそれらを使用している方法を使用することは想定されていませんか? – BrokenGlass

+0

C#でXMLを読むのはまったく新しいです。これはおそらく私がXmlReaderを使用している理由です。私はmtahmedが何を意味するのかよく分かりません。 – DanTonyBrown

答えて

42

あなたの問題が原因この行にある:XmlReader.Createが実行されると、そこにあるように

xml = reader.ReadToEnd(); 

これは最後までリーダーストリームを配置しますそれを読むために流れの中に残されたものは何もない。

xml文字列を入力する必要がある場合は、XmlReader.Createの前にリーダーを閉じてから再度開く必要があります。それ以外の場合は、この行を削除またはコメントアウトすることで問題が解決されます。

+0

正解、ありがとう:) – DanTonyBrown

+0

@DanTonyBrown:うれしいです。問題を解決するのに役立つ解決策の横にあるチェックマークと上向きの矢印をクリックすることを忘れないでください。 –

+0

もし私がXMLをよく知っていたら、レーザーを発射したポニーを手に入れたいと思うかもしれません;) –

4

前述のように最初から読み込みたい場合は、読み込みのたびにベースストリームの位置をリセットしますが、は毎回ストリームを再作成する必要はありません。

String xmlResource = Assembly.GetExecutingAssembly().GetName().Name + ".XML.IODeleter.xsd"; 
configXsd = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(xmlResource)); 
if (configXsd != null) 
    { 
    configXsd.BaseStream.Position = 0; 

    File.WriteAllText(apppath + @"\" + Assembly.GetExecutingAssembly().GetName().Name + ".XML.IODeleter.xsd", configXsd.ReadToEnd()); 
    } 
0

私はXMLで働いていたとき、私は私の読者を作成する前に、だから私は右のそれを呼び出す...それぞれの新しいXmlReaderの前に参照するための迅速な小さな関数を作成

private void ResetStream() 
{ 
    /* 
    The point of this is simply to open the stream with a StreamReader object 
    and set the position of the stream to the beginning again. 
    */ 

    StreamReader reader = new StreamReader(m_stream); 

    if (reader != null) 
    { 
     reader.BaseStream.Position = 0; 
    } 
} 

をアップしました。私はいつも同じ流れを記憶に持ち、決してそれを再現しません。

ResetStream(); 
using (XmlReader reader = XmlReader.Create(m_stream)) { reader.Read(); } 
関連する問題