C # - Поиск дерева выбранного узла в XML-файле и изменение его значения - PullRequest
0 голосов
/ 08 августа 2011

В моей форме есть элемент управления 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 ]

1 голос
/ 08 августа 2011

Должно быть проще связать TreeViewNode с соответствующими XmlElement в точке формирования древовидного представления.Вы можете назначить это свойству Tag каждого TreeViewNode.Когда элемент выбран, все, что вам нужно сделать, это посмотреть на свойство Tag.

0 голосов
/ 19 апреля 2018

Если вы используете XDocument для обработки XML-данных и устанавливаете XDocument в качестве DataContext TreeView, вы можете получить 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.

0 голосов
/ 15 января 2014

Извините, я не знаю, что: 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 = @"\";
            }
        }

В вашем дереве SeViewItemChanged событие TreeView вы можете запустить это событие:

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

            GetSelectedTreeExplorerPath(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
    }

}

В этой статье показано, как работать с XPath. Там демонстрируют, как обновить, удалить или добавить новый элемент. Войдите сюда и загрузите проект, чтобы узнать знания о том, как работает XPathNavigator и изменить элементы.

Надеюсь, это поможет и у вас получится.

Привет!

0 голосов
/ 08 августа 2011

Используйте XLinq, поэтому XDocument и XElement вместо стандартного XmlDocument. Таким образом, ваше древовидное представление будет автоматически обновляться по мере внесения любых изменений в XDocument.

Когда пользователь выбирает элемент, свойство SelectedItem вашего древовидного представления предоставляет связанный XElement. Если вы привяжете TextBox к этому объекту, содержимое обновит элемент, то есть весь древовидный список.

Кроме того, любая модификация структуры XDocument будет отражена в виде дерева.

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...