Сохранить в XML из TreeView

У меня проблема с сохранением моих данных из TreeView . Я просмотрел множество тем, как сохранить данные из TreeView в xml , и я видел несколько методов, как это сделать. Но все они использовали приложение WindowsForms , а nobody - wpf . Я попытался преобразовать эти примеры в wpf , но никто из них не работает правильно. Есть ли способ сделать это? Один из способов, которым я пытался порт:

    void SaveToXml(TreeView tw)
    {
        XmlDocument d = new XmlDocument();
        XmlNode n = d.CreateNode(XmlNodeType.Element, "root", "");
        foreach (TreeViewItem t in tw.Items)
        {
            n.AppendChild(getXmlNode(t, d));
        }
        d.AppendChild(n);
        d.Save(AppDomain.CurrentDomain.BaseDirectory + "out.xml");
    }
    private XmlNode getXmlNode(TreeViewItem tnode, XmlDocument d)
    {
        XmlNode n = d.CreateNode(XmlNodeType.Element, tnode.Name, " ");

        foreach (TreeViewItem t in tnode.Items)
        {
            n.AppendChild(getXmlNode(t, d));
        }
        return n;
    }

Он выбрасывает ArgumentException "Локальные элементы и атрибуты не могут быть пустыми". Я пытаюсь сохранить информацию о файлах на моем диске D: \ , используя код:

  private void ListDirectory(TreeView treeView, string path)
    {
        var rootDirectoryInfo = new DirectoryInfo(path);
        treeView.Items.Add(CreateDirectoryNode(rootDirectoryInfo));
    }

    private static TreeViewItem CreateDirectoryNode(DirectoryInfo directoryInfo)
    {
        var directoryNode = new TreeViewItem();
        directoryNode.Header = directoryInfo.Name;
        try
        {
            foreach (var directory in directoryInfo.GetDirectories())
                directoryNode.Items.Add(CreateDirectoryNode(directory));
            foreach (var file in directoryInfo.GetFiles())
                directoryNode.Items.Add(new TreeViewItem { Header = file.Name });
        }
        catch (UnauthorizedAccessException e)
        { }
        return directoryNode;
    }

Он отлично работает, а TreeView показывает все папки и файлы. Пожалуйста, покажите мне, как сохранить данные из TreeView в xml . Благодарю.

Пробовал это:

  public void exportToXml(TreeView tv, string filename)
    {
        sr = new StreamWriter(filename, false, System.Text.Encoding.UTF8);
        //Write the header
        sr.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
        //Write our root node
        sr.WriteLine("");
        foreach (TreeViewItem node in tv.Items)
        {
            saveNode(node.Items);
        }
        //Close the root node
        sr.WriteLine("");
        sr.Close();
    }

    private void saveNode(TreeViewItem[] tnc)
    {
        foreach (TreeViewItem node in tnc)
        {
            //If we have child nodes, we'll write 
            //a parent node, then iterrate through
            //the children
            if (node.Items.Count > 0)
            {
                sr.WriteLine("<" + node.Name + ">");
                saveNode(node.Items);
                sr.WriteLine("");
            }
            else //No child nodes, so we just write the text
                sr.WriteLine(node.Name);
        }
    }

But saveNode(node.Items); says that there are different types between node.Items and TreeViewItem[], so I tried List<treeViewItem>, but error is the same.

0
nl ja de
добавлено автор Rachel Gallen, источник
@RachelGallen поддерживается, но, не работает (
добавлено автор user1947702, источник

1 ответы

Боюсь, это не настоящий ответ, но вы можете попробовать заменить эту строку:

saveNode(node.Items); 

с этим :

saveNode(node.Items.OfType<treeViewItem>().ToArray()); 

Надеюсь, это поможет,


Пример получения строки с отступом из документа xml:

public static String ToString(XmlDocument doc)
{
    StringBuilder sb = new StringBuilder();
    XmlTextWriter mywriter = new XmlTextWriter(new StringWriter(sb));
    mywriter.Formatting = Formatting.Indented;
    doc.WriteTo( mywriter );
    mywriter.Flush();
    return(sb.ToString());
}
0
добавлено
@ user1947702 вы можете попытаться сгенерировать свой xml в виде строки, загрузить ее в документ xml и создать отступы (отредактировав мой ответ).
добавлено автор jbl, источник
@ user1947702, наконец, с первой попытки вы должны использовать CreateElement вместо CreateNode. Это позволит вам избежать использования «» в качестве namespaceuri
добавлено автор jbl, источник
частично работает, но взгляд на xml отвратителен) Я не уверен, что это XML. Но спасибо.
добавлено автор user1947702, источник
Верстка сайтов HTML/CSS/JS/PHP
Верстка сайтов HTML/CSS/JS/PHP
3 439 участник(ов)

Правила группы: напишите !rules в чате. Группа Вк: vk.com/web_structure Freelancer: @web_fl Веб Дизайн: @dev_design Маркетолог: @topmarkening Автор: @M_Boroda

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Чат — Типичный Верстальщик
Чат — Типичный Верстальщик
1 080 участник(ов)

Основной канал: @tpverstak Обратная связь: @annblok Все ссылки на соц.сети проекта: http://taplink.cc/tpverstak ПРАВИЛА ЧАТА — https://teletype.in/@annblok/BygPgC3E7

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

Веб-Технологи: UI/UX, Вёрстка, Фронтенд
Веб-Технологи: UI/UX, Вёрстка, Фронтенд
167 участник(ов)

Всё про веб-дизайн и вёрстку. А также: HTML, CSS, флекс и бутстрапы, шаблонизаторы, препроцессоры, методологии, аглифаеры, улучшаторы и обфускаторы. Обсуждаем темы юзабилити, устраиваем А/В тесты лендингов, и проводим аудит.

DTP :: @DTPublish
DTP :: @DTPublish
147 участник(ов)

Обсуждаемые темы: полиграфия, препресс, верстка, дизайн, иллюстрации, скрипты, плагины. Канал - @DTPublishing