使用LINQ删除节点后,XML格式不正确

时间:2013-10-02 00:55:42

标签: xml linq

原始XML:

 <?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是Toast,并且IsolatedStorageFileStream阅读器无法读取并出错。

您能否在删除节点时以及将其写回isolatedfilestorage时告诉我我做错了什么?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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,然后使用Createmode创建并编写xml,再次打开文件。

答案 2 :(得分: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的格式是否正确。如果是这种情况,并且在尝试保存时实际发生了否定结果,则问题将是如前所述保存现有数据。