C# - 在xml文件中查找树视图选定节点并更改其值

时间:2011-08-08 08:44:03

标签: c# .net xml xpath treeview

我的表单上有一个TreeView控件,它将XML文件显示为树。还有一个更改按钮,用于更改xml文件中元素的值。 我想这样做:

当用户从树视图中选择一个节点时,我想在我的xml文件中找到该元素/值。如果用户想要更改其值,则他/她将新值键入文本框并按下更改按钮。我希望我的xml文件中选定的元素/值更改为新值。

XPath的SelectSingleNode可以使用元素的名称。 但问题是存在多个具有相同名称但值不同的元素。

像:

<catalog>
   <book>
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
   </book>
   <book>
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
   </book>
   <book>
      <author>Corets, Eva</author>
      <title>Maeve Ascendant</title>
   </book>
</catalog>

怎么做?是否可以使用XPathNavigator执行此操作? 我绝对更喜欢在XPathNavigator的帮助下做到这一点。

感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

在生成树视图时,应该更容易将TreeViewNode s与相关XmlElement相关联。您可以将其分配给每个Tag的{​​{1}}属性。选择项目后,您只需查看TreeViewNode属性。

答案 1 :(得分:0)

使用XLinq,因此使用XDocument和XElement,而不是标准的XmlDocument。这样,您的树视图将自动更新为XDocument中的任何更改。

当用户选择一个项目时,树视图的SelectedItem属性会公开相关的XElement。如果将TextBox绑定到此对象,则内容将更新元素,从而更新整个树视图。

此外,对XDocument结构的任何修改都将反映在树视图中。

干杯

答案 2 :(得分:0)

抱歉,我不知道:D

好的,您可以使用一种方法来计算您选择的树视图路径:

public string SelectedTreeExplorerPath { get; set; }


private void GetSelectedTreeExplorerPath(TreeViewItem treeItem)
        {
            if (treeItem == null)
                return;
            SelectedTreeExplorerPath = "";
            string temp1 = "";
            string temp2 = "";
            while (true)
            {
                temp1 = treeItem.Header.ToString();
                if (temp1.Contains(@"\"))
                {
                    temp2 = "";
                }
                SelectedTreeExplorerPath = temp1 + temp2 + SelectedTreeExplorerPath;
                if (treeItem.Parent.GetType().Equals(typeof(TreeView)))
                {
                    break;
                }
                treeItem = ((TreeViewItem)treeItem.Parent);
                temp2 = @"\";
            }
        }

在treeView SelectedItemChanged事件中,您可以触发此事件:

private void treeViewItem_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            TreeView tree = (TreeView)sender;
            TreeViewItem treeItem = ((TreeViewItem)tree.SelectedItem);

            GetSelectedTreeExplorerPath(treeItem);
        }

您可以获得使用以下内容获取的treeItem名称:

string treeItemName = Path.GetFileName(SelectedTreeExplorerPath);

现在你创建:

XPathDocument doc;
XPathNavigator nav;
XPathExpression expr; 
XPathNodeIterator iterator;

现在要在你的XML文件中搜索treeViewItem_SelectedItemChanged是:

doc = new XPathDocument(FILE_NAME);
nav = doc.CreateNavigator();
// Compile a standard XPath expression
expr = nav.Compile("/catalog/cd/title");
iterator = nav.Select(expr);
while (iterator.MoveNext())
{
    XPathNavigator nav2 = iterator.Current.Clone();
    if (nav2.Value == treeItemName)
    {
        // repleace item as showed in the example project provided as resource below
    }

}

This Article向您展示如何使用XPath。详细介绍了如何更新,删除或添加新项目。在此输入并下载项目以了解有关如何使用XPathNavigator和更改项目的知识。

我希望它有所帮助,它适合你。

问候!

答案 3 :(得分:0)

如果使用XDocument处理XML数据并将XDocument设置为Treeview的DataContext,则可以使用

获取与所选节点对应的XElement。
XElement node = null;
foreach (XElement xe in (theTreeView.DataContext as XDocument).Descendants(System.Xml.Linq.XDocument.Parse(theTreeView.selectedItem).Root.Name.LocalName)){
    if (xe.ToString() == derBaum.SelectedItem.ToString())
    {
        node= xe;
        break;
    }
}

您可以操纵找到的节点。更改将在TreeView中提供。