2016-05-10 8 views
1

xmlから要素を削除します。xmlから要素を削除した後、XDocumentは最後に行を追加します

StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder; 
StorageFile MyFile = await localFolder.GetFileAsync("CustomTV.xml"); 
var stream4 = await MyFile.OpenStreamForReadAsync(); 
XDocument myXml2 = XDocument.Load(stream4); 
myXml2.Element("channelLists") 
       .Elements("channellist") 
       .Where(x => (string)x.Attribute("lname") == lnameselectedText) 
       .Remove(); 
using (var stream = await (await ApplicationData.Current.LocalFolder.CreateFileAsync("CustomTV.xml", CreationCollisionOption.OpenIfExists)).OpenAsync(FileAccessMode.ReadWrite)) 
{ 
    myXml2.Save(stream.AsStreamForWrite()); 
} 

属性 "lname = name3"の要素を削除する前。

<?xml version="1.0" encoding="utf-8"?> 
<channelLists> 
<channellist lname="name1" /> 
<channellist lname="name2" /> 
<channellist lname="name3" /> 
<channellist lname="name4" /> 
</channelLists> 

削除後;

<?xml version="1.0" encoding="utf-8"?> 
<channelLists> 
<channellist lname="name1" /> 
<channellist lname="name2" /> 
<channellist lname="name4" /> 
</channelLists>lname="name4"/> //It adds all the time this line with last elements attribute. 
</channelLists> 

何が問題ですか?

答えて

0

あなたのコードは元のXMLの上に変更されたXMLを書き込むようです。 CreationCollisionOption.ReplaceExistingこの場合、より適切であるかもしれない、と述べた

lname="name4"/> 
</channelLists> 

:あなたが変更されたXMLの拡張を越えて位置元のXMLのリマインダーを参照してください理由です。

+0

私はそれが理由だと思いますが、今回はデバッグ時に「アクセス拒否」アラートが表示されます。 – user2542030

+0

変更されたxmlを書き込む前に、既存のXMLをロードするために使用されたストリームを閉じますか? – har07

+1

編集: "stream4.Dispose();"を追加しました。 "XDocument myXml2 = XDocument.Load(stream4);"の後の行。 @ har07は何を言ったのか、問題は解決しました。 – user2542030

関連する問題