我的表单上有一个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的帮助下做到这一点。
感谢任何帮助。
答案 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中提供。