2011-07-03 6 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 경로를 사용하면 거의 동일한 결과를 얻습니다. // dict 경로도 마찬가지입니다. "/ 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); 
     } 

당신은 일시적으로 목록에서 요소를 넣고 루프의 외부로 제거해야 할 수 있습니다.

관련 문제