xml元素删除表单xml文件wp8

时间:2014-03-15 09:16:30

标签: c# xml windows-phone-8 linq-to-xml

您好我尝试删除xml元素但代码运行成功但是当我检查xml文件数据时没有删除 这是我的Xml数据如何删除 在xml文件中pageno是不同的请帮助

   <data>
  <Bookmarkdata>
    <Bookname>thepdftest</Bookname>
    <Bookid>57d86c55-1d9a-49d0-8b60-acdc0c283d24</Bookid>
    <Pageno>1</Pageno>
  </Bookmarkdata>
  <Bookmarkdata>
    <Bookname>thepdftest</Bookname>
    <Bookid>57d86c55-1d9a-49d0-8b60-acdc0c283d24</Bookid>
    <Pageno>2</Pageno>
  </Bookmarkdata>
  <Bookmarkdata>
    <Bookname>thepdftest</Bookname>
    <Bookid>57d86c55-1d9a-49d0-8b60-acdc0c283d24</Bookid>
    <Pageno>3</Pageno>
  </Bookmarkdata>
</data>

这是我的代码

1.这不是任何错误,但不是删除

 doc.Descendants("Bookmarkdata")
    .Where(x => (string)x.Attribute("Pageno") == pageno)
    .Remove();

我尝试使用两个条件使用并返回错误

 doc.Descendants("Bookmarkdata")
    .Where((x => (string)x.Attribute("Pageno") == pageno) &&
           (x => (string)x.Attribute("Bookname") == bookname))
    .Remove();

这是我的完整代码

private void DeleteBookMark(string bookname, string pageno)
{

    using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication())
    {
        if (!file.FileExists("BookmarkFile.xml"))
        {
            StreamResourceInfo sr_en = Application.GetResourceStream(new Uri("Resources\\BookmarkFile.xml", UriKind.Relative));
            using (BinaryReader br_en = new BinaryReader(sr_en.Stream))
            {
                byte[] data1 = br_en.ReadBytes((int)sr_en.Stream.Length);
                //Write the file.
                using (BinaryWriter bw = new BinaryWriter(file.CreateFile("BookmarkFile.xml")))
                {
                    bw.Write(data1);
                    bw.Close();
                }
            }
        }

        // work with file at isolatedstorage
        using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream("BookmarkFile.xml", FileMode.Open, file))
        {
            XDocument doc = XDocument.Load(stream, LoadOptions.None);

            doc.Descendants("Bookmarkdata")
                .Where((x => (string)x.Attribute("Pageno") == pageno) && (x => (string)x.Attribute("Bookname") == bookname))
                .Remove();


            // prevent xml file from doubling nodes
            if (stream.CanSeek)
                stream.Seek(0, SeekOrigin.Begin);
            doc.Save(stream);
        }
    }

}

1 个答案:

答案 0 :(得分:1)

您有两个lambdas,您正在与&&进行比较。 Lambda是一种匿名方法 - 它不是方法执行的结果。因此,您尝试对方法应用条件AND,这会给您带来错误。

Where运算符接受一个应该返回布尔值的委托。这是正确的语法:

 doc.Descendants("Bookmarkdata")
    .Where(x => (string)x.Element("Pageno") == pageno && 
                (string)x.Element("Bookname") == bookname)
    .Remove();

注意:<Pageno><Bookname>都是元素,而不是属性。