在C#中删除特定的XML元素及其子元素

时间:2014-04-16 10:15:24

标签: c# xml windows-phone-8

说我有这个XML文件:

<Stops>
    <Stop>
        <ID>1022</ID>
        <UserDescription>Test</UserDescription>
    </Stop>
    <Stop>
        <ID>1053</ID>
        <UserDescription>Test1045</UserDescription>
    </Stop>
</Stops>

我想删除ID等于值的整个节点。

所以,例如用1022删除节点应该给出:

<Stops>
    <Stop>
        <ID>1053</ID>
        <UserDescription>Test1045</UserDescription>
    </Stop>
</Stops>

到目前为止我一直在尝试的代码(Windows Phone中的C#)。它似乎变形并使XML不可读。我不知道我哪里出错...

        using (isoStore)
        {
            XDocument doc;
            using (IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream(StopFileName, FileMode.Open, isoStore))
            {
                doc = XDocument.Load(isoStream, LoadOptions.None);
                doc.Descendants("Stop")
                      .Where(x => (string)x.Element("ID") == "1022").Remove();

                doc.Save(isoStream);
            }
        }

1 个答案:

答案 0 :(得分:0)

我认为您的错误是使用相同的流读取和保存。

如果您查看自己的代码,请从文件中加载xml:

doc = XDocument.Load(isoStream, LoadOptions.None);

然后保存到同一个流:

doc.Save(isoStream);

所以你最终得到一个看起来像这样的XML文件

<Stops>
    <Stop>
        <ID>1022</ID>
        <UserDescription>Test</UserDescription>
    </Stop>
    <Stop>
        <ID>1053</ID>
        <UserDescription>Test1045</UserDescription>
    </Stop>
</Stops>
<Stops>
    <Stop>
        <ID>1053</ID>
        <UserDescription>Test1045</UserDescription>
    </Stop>
</Stops>

拥有2个根元素确实会导致“意外的XML声明”

我会更改你的代码,所以首先你读取文件,然后创建一个新文件/覆盖现有文件。

        using (isoStore)
        {
            XDocument doc;
            using (IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream(StopFileName, FileMode.Open, isoStore))
            {
                doc = XDocument.Load(isoStream, LoadOptions.None);
            }

            doc.Descendants("Stop")
                      .Where(x => (string)x.Element("ID") == "1022").Remove();

            using (IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream(StopFileName, FileMode.Create, isoStore))
            {
                doc.Save(isoStream);
            }
        }