Helluva: время попытки загрузки XML в C# WPF - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь сделать что-то очень простое. Я просто хочу загрузить экран полей с файлом XML. Всегда будет только один элемент с несколькими узлами на XML. Он всегда будет выглядеть следующим образом: XML.

Поля имеют то же имя, но удалите «сообщение» в начале, чтобы «postcity» содержал текст, который я на самом деле пытаюсь загрузить в город. Текст

Я пробовал все учебники, но все они сосредоточены на импорте нескольких XML элементов, таких как база данных. Я просто хочу загрузить его.

<information xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<postRoomOrigin>OKC1234</postRoomOrigin>

<postcity>OKC</postcity>

<postchairCount>12</postchairCount>

<postfirstName>sdfghjqwertyhj</postfirstName>

<postlastName>erfghj</postlastName>

</information>

Вот мой код

 private void clickLoadConfig_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load("C:\\config.xml");


        //Now I want to load <postfirstName>Josh</postfirstName> into firstName.Text
        //So firstName.Text = "Josh"
    }

1 Ответ

0 голосов
/ 12 августа 2020

Я думаю, что следующий код сделает то, что вы ищете. Вы не упомянули, какой тип полей вы используете, но вы упомянули city.Text, поэтому я просто использовал TextBox в качестве примера. Как Crowcoder указал в комментариях, пожалуйста, постарайтесь предоставить нам достаточно кода и информации, чтобы мы могли воспроизвести проблему, с которой вы столкнулись. Если, например, вы используете шаблон проектирования MVVM, в моем ответе потребуется использовать связываемые свойства publi c вместо прямого доступа к элементам управления окна.

Если вы новичок в программировании, мой пример MVVM может ничего не значить для вас, но это не важно. Я просто указываю, что ответы будут меняться в зависимости от предоставленной вами информации. Попробуйте предоставить все основы. Например, «Я использую стандартный проект WPF. У меня есть окно, содержащее 5 текстовых полей, и я хочу загрузить в эти поля содержимое файла XML». Затем предоставьте код XAML для вашего окна, код C#, который вы используете для загрузки файла XML et c. и объясните проблему как у вас. Мы просим об этом, так как это облегчает нам помощь вам и облегчает понимание вопроса и решения всем, у кого есть такая же / похожая проблема. Вот ссылка, которую Crowcoder уже предоставил для руководства StackOverflow по размещению вопросов: { ссылка }

Ответ и объяснение

Чтобы объяснить мой ответ, Сначала я нашел узел root из вашего файла XML (т.е. узел ). Метод SelectSingleNode() использует язык запросов XPath для поиска искомого узла. /, который я использовал в doc.SelectSingleNode("/information");, указывает метод выбора из узла root. Вы можете найти больше примеров синтаксиса XPath здесь: https://www.w3schools.com/xml/xpath_syntax.asp

Затем l oop через каждого из дочерних узлов в узле root, проверьте, начинается ли имя дочернего узла с 'post' и удалите его, если есть. Наконец, я пытаюсь найти TextBox с совпадающим именем и установить для его содержимого значение дочернего узла.

XmlDocument doc = new XmlDocument();
doc.Load("config.xml");

XmlNode rootNode = doc.SelectSingleNode("/information"); // Select the root <information> node

foreach (XmlNode childNode in rootNode.ChildNodes) // Loop through every child node within the root node
{
    string name = childNode.Name;

    if (name.StartsWith("post"))
    {
        name = name.Remove(0, 4); // Remove "post" from the beginning of the name
    }

    TextBox textBox = this.FindName(name) as TextBox; // Find the control on your window with the matching name
    if (textBox != null)
    {
        textBox.Text = childNode.Value;
    }
}

Если вы используете C# 7.0 или новее (Visual Studio 2017 или позже) следующее:

TextBox textBox = this.FindName(name) as TextBox; // Find the control on your window with the matching name
if (textBox != null)
{
    textBox.Text = childNode.Value;
}

можно упростить, используя сопоставление с образцом:

if (this.FindName(name) is TextBox textBox) // Find the control on your window with the matching name
{
    textBox.Text = value;
}

Вы можете найти дополнительную информацию о сопоставлении с образцом, используя is здесь: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is

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