2011-07-03 15 views
0

編集:バグが見つかりました。 XmlNodeList nodes = mydoc.SelectNodes( "// dict/dict/dict");構造が間違っています。正しいXMLスキーマは "/ plist/dict/dict/dict"です。これで正しい出力が得られました。ノードを削除してもまだ動作しません 終了編集ノードがXmlDocumentから削除されていません

私のコードでは、削除したいノードが削除されない限り、すべてが正常であるようです。

XmlDocument mydoc = new XmlDocument(); 
    mydoc.Load(@"C:\Users\boston\Documents\Visual Studio 2010\WebSites\iTunes\iTunes Music Library.xml"); 
    XmlNodeList nodes = mydoc.SelectNodes("//dict/dict/dict"); 

    Response.Write(nodes.Count + " nodes found in the xml file <hr>"); 

    string s1; 

    for (int i = 1; i <= nodes.Count -1; i++) 
    { 
     foreach (XmlElement s in nodes[i]) 
     { 
      s1 = s.InnerText; 
      int j = s1.CompareTo("Location"); 
      if (j == 0) 
      { 
       s1 = s.NextSibling.InnerText; 
       if (s1.Contains("201.mp3")) 
       { 
        Response.Write(s1.ToString() + "<br>"); 
        nodes[i].ParentNode.RemoveChild(nodes[i]); 

       } 
      } 
     } 

     } 

    mydoc.Save(@"C:\Users\boston\Documents\output4.xml"); 

この犯人行はこれかもしれません。私は間違って何をしていますか?

nodes[i].ParentNode.RemoveChild(nodes[i]); 

同様のポストHow to remove an XmlNode from XmlNodeListが存在し、私はその構文が適用されますが動作しません。

編集:問題は、ラインに いるXmlNodeListノード= mydoc.SelectNodes( "//辞書/ dictの/辞書")であるよう

が見えます。

私が// dict // dictのパスを使用すると、私はほとんど同じ結果になります。 // dict pathと同じです。私が "/ dict/dict /"を使用すると、スクリーン印刷の結果が0になります。

xmlファイルをコピーしていますが、これは問題の原因となっている可能性があります。

<dict> 
<key>Major Version</key><integer>1</integer> 
<key>Minor Version</key><integer>1</integer> 
<key>Application Version</key><string>10.3.1</string> 
<key>Features</key><integer>5</integer> 
<key>Show Content Ratings</key><true/> 
<key>Music Folder</key><string>folderpath</string> 
<key>Library Persistent ID</key><string>77392150B1B5EE9C</string> 
<key>Tracks</key> 
<dict> 
    <key>1791</key> 
    <dict> 
     <key>Track ID</key><integer>1791</integer> 
     <key>Name</key><string>Deewana</string> 
     <key>Artist</key><string>Ali Azmat</string> 
     <key>Album</key><string>Social Circus</string> 
     <key>Genre</key><string>Other</string> 
     <key>Kind</key><string>MPEG audio file</string> 
     <key>Size</key><integer>6375424</integer> 
     <key>Total Time</key><integer>398288</integer> 
     <key>Track Number</key><integer>1</integer> 
     <key>Year</key><integer>2005</integer> 
     <key>Date Modified</key><date>2005-04-13T19:12:57Z</date> 
     <key>Date Added</key><date>2011-06-19T20:14:29Z</date> 
     <key>Bit Rate</key><integer>128</integer> 
     <key>Sample Rate</key><integer>44100</integer> 
     <key>Play Count</key><integer>1</integer> 
     <key>Play Date</key><integer>3391853283</integer> 
     <key>Play Date UTC</key><date>2011-06-25T17:28:03Z</date> 
     <key>Persistent ID</key><string>504630D34E216D84</string> 
     <key>Track Type</key><string>File</string> 
     <key>Location</key><string>filepath</string> 
     <key>File Folder Count</key><integer>5</integer> 
     <key>Library Folder Count</key><integer>1</integer> 
    </dict> 
+0

答えはあなたのために働いていますか? –

+0

XMLファイル(上記のスニペット)の形式が異なるため、いいえ。私はそれがポイントに私が欲しいノードに到達するために働いている。ノードを削除することはまだ問題です。私は上記の私のコードを提供し、私はXMLファイルを扱っています。ありがとう –

+0

コードスニッパが正確に提供されていますか。が正しく終了していません。間違っています。また、複数のルーツがあります。 –

答えて

2

まず、/ foreachループにあるノードを削除しようとしています。 これはできません。

  for (int i = 1; i <= nodes.Count -1; i++) 
      { 
       foreach (XmlElement s in nodes[i]) 
       { 
        nodes[i].ParentNode.RemoveChild(nodes[i]); //Cannot remove the element for nodes[i]. 
       } 
      } 

ではなく、あなたは

 var list = new List<XmlElement>(); 
     for (int i = 1; i <= nodes.Count -1; i++) 
     { 
      foreach (XmlElement s in nodes[i]) 
      { 
      list.Add(nodes[i]); 
      } 
     } 
     foreach(var listTemp in list) 
     { 
      nodes.remove...(listTemp); 
     } 

あなたは一時的なリストに要素を入れた後、forループの外にそれを削除する必要がありますすることができます。

関連する問題