0

原始 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什么吗?

4

3 回答 3

1

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

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

{<Links>  
     <Category name="a" />
     </Links>}="a" />  
     <Category name="b" />
 </Links>
于 2013-10-02T01:03:50.593 回答
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 文件模式再次打开文件并写入 xml。

于 2013-10-02T01:30:38.607 回答
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 的格式是否正确。如果是这种情况,并且在尝试保存时实际发生了负面结果,那么问题将是如前所述保存现有数据。

于 2013-10-02T01:26:41.533 回答