【问题标题】:How to delete chosen node from ListBox in an XML file如何从 XML 文件中的 ListBox 中删除所选节点
【发布时间】:2019-04-08 23:31:13
【问题描述】:

我有一个简单的窗口,其中 XML 节点作为项目加载到 ListBox。现在我想通过从该 ListBox 中选择一个项目并单击要删除的按钮来删除一些节点。

我尝试将所选项目存储到变量中,如果 InnerText 在 XML 中与 ListBox 中的所选项目具有相同的值,则该变量将进行比较。但肯定有问题,因为它不起作用。

C#代码:

static string projectDirectory = Directory.GetParent(workingDirectory).Parent.FullName;
static string xmlLocation = System.IO.Path.Combine(projectDirectory, "SubjectList.xml");

string selectedSubjectItem;

private void DeleteSubjectButton_Click(object sender, RoutedEventArgs e)
        {
            XmlDocument document = new XmlDocument();
            document.Load(xmlLocation);
            foreach(XmlNode node in document.SelectNodes("Subjects/Subject"))
            {
                if (node.SelectSingleNode("Subject").InnerText == selectedSubjectItem)
                {
                    node.ParentNode.RemoveChild(node);
                }
                document.Save(xmlLocation);
            }
        }

        private void SubjectList_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            selectedSubjectItem = SubjectList.SelectedItem.ToString();
        }

XAML 代码:

    <Grid>
        <Grid.Resources>
            <XmlDataProvider x:Key="SubjectData" Source="SubjectList.xml" XPath="/Subjects/Subject"/>
        </Grid.Resources>
        <DockPanel Margin="10">
            <StackPanel DockPanel.Dock="Right" Margin="10,0,0,0">
                <Button Name="AddSubjectButton" Margin="0,0,0,5" Click="AddSubjectButton_Click">Add</Button>
                <Button Name="DeleteSubjectButton" Click="DeleteSubjectButton_Click">Delete</Button>
            </StackPanel>
            <StackPanel DockPanel.Dock="Left">
                <ListBox x:Name="SubjectList" Margin="0,0,0,0" ItemsSource="{Binding Source={StaticResource SubjectData}}" ScrollViewer.VerticalScrollBarVisibility="Visible" Height="175" SelectionChanged="SubjectList_SelectionChanged"></ListBox>
                <TextBox x:Name="InputNewSubject" Text="Input new subject..."/>
            </StackPanel>
        </DockPanel>
    </Grid>
</Window>

XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<Subjects>
  <Subject>Subject1</Subject>
  <Subject>Subject2</Subject>
  <Subject>Subject3</Subject>
</Subjects>

【问题讨论】:

  • 不起作用”不能作为 SO 问题陈述。您遇到的行为是什么?

标签: c# xml wpf


【解决方案1】:

我认为您的节​​点选择有误。你试过吗?

foreach (XmlNode node in document.SelectNodes("/Subjects/Subject"))
{
    if (node.InnerText == selectedSubjectItem)
    {
        node.ParentNode.RemoveChild(node);
    }
}

我还将document.Save(xmlLocation); 移动到 foreach 循环下方,这样文档只会保存一次。

【讨论】:

    【解决方案2】:

    SubjectList.SelectedItem.ToString() 将返回“System.Xml.XmlElement”。您应该将 SelectedItem 转换为 XmlElement 并访问其 InnerText 属性以获取实际值:

    private void SubjectList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        selectedSubjectItem = (SubjectList.SelectedItem as XmlElement)?.InnerText;
    }
    

    然后你可以将它与节点的InnerText进行比较:

    private void DeleteSubjectButton_Click(object sender, RoutedEventArgs e)
    {
        XmlDocument document = new XmlDocument();
        document.Load(xmlLocation);
        foreach (XmlNode node in document.SelectNodes("Subjects/Subject"))
        {
            if (node.InnerText == selectedSubjectItem)
            {
                node.ParentNode.RemoveChild(node);
            }
        }
        document.Save(xmlLocation);
    }
    

    另请注意,您应该只在foreach 循环之后调用一次Save 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 2019-04-12
      • 2023-03-24
      • 2018-03-17
      • 1970-01-01
      相关资源
      最近更新 更多