如何删除Windows Phone中的xml元素

时间:2014-10-04 16:38:37

标签: c# xml windows-phone-8

在我可以创建一个xml并向其添加数据和元素之后,我希望能够从中删除特定元素。我试着按照它在Deleting XML element nodes的说法,然后我就可以从中删除任何元素;但是,它并没有完全消除该元素;因此,它会对我的xml文件产生错误。

我的样本xml是这样的(在删除之前)

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--Favorite's xml-->
<favorites>
  <favorite id="1" pro_id="1" pro_name="Boots Expert Anti-Blemish Cleansing Foam" cate_xml="ProductsOily.xml" pro_image="images/Oily-Dry/BO001.JPG" />
  <favorite id="2" pro_id="2" pro_name="Clean &amp; Clear Advantage Oil Absorbing Cream Cleanser" cate_xml="ProductsOily.xml" pro_image="images/Oily-Dry/BP251.jpg" />
</favorites>

从示例中,我尝试删除pro_id等于1的元素,但我的xml文件在删除后变为这样

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--Favorite's xml-->
<favorites>
  <favorite id="2" pro_id="2" pro_name="Clean &amp; Clear Advantage Oil Absorbing Cream Cleanser" cate_xml="ProductsOily.xml" pro_image="images/Oily-Dry/BP251.jpg" />
</favorites>" pro_name="Clean &amp; Clear Advantage Oil Absorbing Cream Cleanser" cate_xml="ProductsOily

这是我的代码:

var storage = IsolatedStorageFile.GetUserStoreForApplication();
fileName = "Favorite\\Favorite.xml";
XDocument docx = null;
using (IsolatedStorageFileStream isoStreamx = new IsolatedStorageFileStream(fileName, FileMode.Open, storage))
{
   // isoStreamx.Position = 0;
    docx = XDocument.Load(isoStreamx);

    isoStreamx.SetLength(docx.ToString().Length);

    docx.Root.Elements().Where(x => x.Attribute("pro_id").Value == NavigationContext.QueryString["id"] as string).Remove();

    isoStreamx.Position = 0;
    docx.Save(isoStreamx);
}

如何完全删除元素?请帮助我,谢谢。

1 个答案:

答案 0 :(得分:1)

您目前正在重复使用相同的流来保存顶部。这只会覆盖数据 - 它不会截断文档末尾的文件。您真正想要做的是有效地创建一个新文件。类似的东西:

var storage = IsolatedStorageFile.GetUserStoreForApplication();
fileName = "Favorite\\Favorite.xml";
XDocument docx = null;
using (var isoStreamx = new IsolatedStorageFileStream(fileName, FileMode.Open, storage))
{
    docx = XDocument.Load(isoStreamx);
}

var target = (string) NavigationContext.QueryString["id"];
docx.Root
    .Elements()
    .Where(x => x.Attribute("pro_id").Value == target)
    .Remove();

using (var isoStreamx = new IsolatedStorageFileStream(fileName, FileMode.Create, storage))
{
    docx.Save(isoStreamx);
}

可能保留当前的代码,最后只需拨打isoStreamx.SetLength(isoStreamx.Position)(删除当前毫无意义且已损坏的SetLength电话) - 但我认为使用它更清晰上面的代码。