2013-10-02 85 views
0

原始XML后也形成:XML不删除节点使用LINQ

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Links> 
     <Category name="a" /> 
     <Category name="b" /> 
</Links> 

我要删除其属性=“b”和我用下面的代码

using (IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication()) 
{ 
    using (IsolatedStorageFileStream myStream = new IsolatedStorageFileStream(App.FileName, FileMode.Open, FileAccess.ReadWrite, myStore)) 
    { 
      XElement mainTree = XElement.Load(myStream); 
      mainTree.Elements("Category").Where(s => s.Attribute("name").Value == "b").DescendantsAndSelf().Remove(); 
      myStream.Position = 0; 
      mainTree.Save(myStream); 
     } 
} 

做它的类节点代码运行后,生成的XML看起来像这样...

<?xml version="1.0" encoding="utf-8"?> 
<Links> 
    <Category name="a" /> 
    </Links>="a" /> 
    <Category name="b" /> 
</Links> 

正如你可以看到XML是烤面包和c注意由IsolatedStorageFileStream读取器读取并将错误读出。

你能否告诉我我在做什么错误时删除节点,还写回isolatedfilestorage

回答

1

您应该在您的流操作范围之外尝试您的代码。例如,如果你运行这个:

var mainTree = XDocument.Parse(@"<Links> 
            <Category name='a' /> 
            <Category name='b' /> 
           </Links>"); 
mainTree.Elements("Category") 
     .Where(s => s.Attribute("name").Value == "b") 
     .DescendantsAndSelf() 
     .Remove(); 

Console.WriteLine(mainTree.ToString(SaveOptions.None)); 

你会看到它再现你的输入。试试这个linq表达式:

mainTree.Root 
     .Elements("Category") 
     .Where(s => s.Attribute("name").Value == "b") 
     .Remove(); 

我想你试图找到你的“类别”的元素在“链接”相同的水平。您不需要DescendantsAndSelf()调用,当您删除(移除)xml节点时,您将删除其包含的所有子节点。

接下来的问题是你正在覆盖一个文件。您想在用较短的内容重写之前清除该文件。在创建XDocument之后,关闭流,运行你的linq,然后用Create的filemode再次打开文件并写入你的xml。

+0

感谢您的快速回复家伙。问题在于节省内容。我用Create模式重新打开了流,并保存了更改后的MainTree,并且它工作正常。 – Sam

1

看起来像麻烦的是你保存在同一个文件中的现有数据而不清除它。您需要完全清除文件或保存到新文件。

{}是有效的xml段,除此之外的所有内容都是旧文件。

{<Links> 
    <Category name="a" /> 
    </Links>}="a" /> 
    <Category name="b" /> 
</Links> 
0

要在前面给出的答案扩大 -

我试图用LinqPad一个简单的试验:

var xml = XElement.Parse(@"<?xml version='1.0' encoding='utf-8'?><Links><Category name='a' /><Category name='b' /></Links>"); 

xml.Elements("Category").Where(s => s.Attribute("name").Value == "b").DescendantsAndSelf().Remove(); 
Console.WriteLine(xml.ToString()); 

产生预期的效果:

<Links> 
    <Category name="a" /> 
</Links> 

你会想验证删除后xml格式正确。如果是这种情况,并且在尝试保存时实际发生负面结果,则问题将如前所述保存在现有数据上。