sz3bbylA Ответов: 2

Чтение/обновление класса XML-документов


сначала извини, но я ретранслятор нуб и стараюсь учиться .

У меня есть Xml-документ, например xmldoc.xml

<root>
    <one>first_one</one>
    <two>second_one</two>
    <tree>third_one</tree>
    <four>fourth_one</four>
    <five>fifth_one</five>
    <six>sixth_one</six>
</root>


Что я уже пробовал:

моя проблема заключается в том, что я пытаюсь прочитать и/или обновить один или несколько элементов внутри моего корневого узла.
Честно говоря, я понятия не имею, как это сделать.

Я пытаюсь сериализатор, но я стек, потому что не знаю, чтобы создать класс, как я попытаюсь объяснить:

XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(xmldoc.xml);
XmlNode root = xmldoc.FirstChild;

//create select_array[] = { one, tree four}
//create array new_val[] = {one => "first_second", tree => "tree_second", four => "four_second" }

// 1. create a class read_array values of one, tree four
// 2. create class save_array_new values of one, tree four

Я не знаю , как создать класс read или save таким образом, чтобы можно было изменить одно, два .. или все значения узлов

то что я пишу это только моя идея использовать массив но я не думаю что это хорошо

0x01AA

Здесь Решение 1 вероятно поможет: чтение и обновление XML-файла с помощью языка C#[^]

2 Ответов

Рейтинг:
2

RickZeeland

Вот простой пример использования XElement:

            string TestXml = @"<root>
    <one>first_one</one>
    <two>second_one</two>
    <tree>third_one</tree>
    <four>fourth_one</four>
    <five>fifth_one</five>
    <six>sixth_one</six>
</root>";

            XElement x = XElement.Parse(TestXml);
            var one = x.Element("one");
            one.Value = "CHANGED ONE";
            x.Element("two").Remove();

            foreach (var item in x.Elements())
            {
                Debug.Print(item.ToString());
            }

Если вы предпочитаете использовать XDocument, это не сильно отличается, Вы должны будете помнить, чтобы использовать корень, см. объяснение здесь: Запрос объекта XDocument и Запрос XElement (C#) | Microsoft Docs[^]
Но как говорится в документации MSDN:
Цитата:
Во многих случаях приложение не требует создания документа. С помощью класса XElement можно создать XML-дерево, добавить в него другие XML - деревья, изменить XML-дерево и сохранить его.
Обзор Класса XDocument (C#) | Microsoft Docs[^]

Обратите внимание, что вам нужно только XmlDocument при использовании .Чистая версия 3.0 или ниже.


Maciej Los

Что ж... OP хочет использовать класс XmlDocument вместо XDocument...

RickZeeland

Смотрите обновленное решение :)

Maciej Los

Гораздо лучше!

sz3bbylA

Данные на корневом уровне недопустимы. Линия 1, Позиция 1.
Я не эксперт, срри, я не знаю, как им пользоваться

RickZeeland

Вы должны поместить его внутри метода, например Main в Program.cs или любого другого метода, удачи !
Обратите внимание, что это пример Winforms, который может не работать с WPF.

sz3bbylA

Я уже сделал что-то вроде :
xmldoc.xml
Скрыть Код Скопировать
<root>
&ЛТ;один&ГТ;first_one
&ЛТ;два&ГТ;second_one
&ЛТ;дерево&ГТ;third_one &ЛТ;четыре&ГТ;fourth_one
&ЛТ;пять&ГТ;fifth_one
<six>sixth_one



Скрыть Код Скопировать
класс Use_Xml
{
общественная статический недействительным Save_data(объект obj, строковый именем)
{
Помощью которого XmlSerializer СД = новый сериализатор XmlSerializer(объект.Метод gettype());
TextWriter writer = новый StreamWriter(имя файла);
sd.Serialize(writer, obj);
писатель.Закрывать();
}
}


Скрыть Код Скопировать
установка открытый класс
{
частная строка one_val;
частная строка two_val;
частная строка tree_val;
частная строка four_val;
частная строка five_val;
частная строка six_val;

публичная строка один
{
get { return one_val; }
set { one_val = значение; }
}
.......................................
общественного строка шесть
{
get { return six_val; }
set { six_val = значение; }
}
}


Я называю это с помощью:

Скрыть Код Скопировать
Значение = новое значение
{
Один = "one_second",
...................
Шесть = "six_second"
}
Use_Xml.Save_data(набор, location_file);


Только этот может обновить все значения

Моя проблема в том, что
1. Я хочу, чтобы обновить один, два или все значения
2. Я хочу прочитать один, два ... или все значения

Я пытаюсь использовать десериализатор, но у меня был стек

я вижу некоторые решения, но они не соответствуют моей ситуации
я хотел бы сделать файл настройки для сохранения параметров программы, которая будет загружена на Window_Loaded
проблема в том, что я хочу просто обновить параметры, а также прочитать один или несколько параметров

RickZeeland

Я думаю, что лучше опубликовать это как новый вопрос, так как он полностью отличается от вашего первоначального вопроса. Также попробуйте изучить настройки приложения в C# там достаточно доступной информации, просто погуглите на "Настройки Приложения C#".

Рейтинг:
0

Maciej Los

Пожалуйста, обратитесь к документации MSDN: Класс XmlDocument (System.Xml) | Microsoft Docs[^], особенно Найти узлы[^] и Edit nodes.
Возможно, вас заинтересует Выбор Узлов С Помощью Навигации XPath[^]

[РЕДАКТИРОВАТЬ]
В соответствии с требованиями ОП (опубликовано в решении 3):

Цитата:
Я хочу сохранить xml-файл таким, как он есть
1. Единственное, что мне нужно, это создать класс, Как прочитать одну, две, дерево или все значения элементов
2. один класс для обновления одного, двух, дерева или всех элементов значений


Я бы рекомендовал изменить вашу xml структуру на эту:
<MyItems>
    <MyItem id = "first">first one</Item>
    <MyItem id = "second">first one</Item>
    <MyItem id = "third">first one</Item>
    <MyItem id = "fourth">first one</Item>
    <!-- and so on -->
</MyItems>


Класс, представляющий один элемент, который может выглядеть следующим образом:
public class MyItem
{
	public string id = "first";
	public string text = "first_one";  
}


Наконец, вам нужна коллекция MyItem.

Для получения более подробной информации, пожалуйста, прочтите мой совет: Полный пример сериализации и десериализации пользовательских коллекций классов[^]. Правда, это написано в Vb.net, но вы должны справиться с этим, потому что Vb.net это очень похоже на C#.