Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
3 / 3 / 1
Регистрация: 29.08.2012
Сообщений: 24
.NET 4.x

Create XML file with XPath, using XDocument

07.05.2014, 20:13. Показов 2062. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! (тема на англ, т.к. форум не позволяет использовать понятное русское название)

Требуется создать XML файл с помощью XPath.

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

Пример:
XML
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<Settings>
  <Window>
    <Topmost>true</Topmost>
    <!-- сюда нельзя больше ничего добавить -->
  </Window>
<!-- сюда нельзя больше ничего добавить -->
</Settings>
Происходит это потому, что в функции каждый раз создается новый элемент с уже существующими. Как исправить не знаю, бьюсь второй день.

Вот функция:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
private static XNode CreateNodeFromXPath(XNode elem, string xpath)
        {
            // Create a new Regex object
            var r = new Regex(@"/+([a-zA-Z0-2\.\-]+)(\[@([a-zA-Z0-2\.\-]+)='([^']*)'\])?|/@([a-zA-Z0-2\.\-]+)");
 
            xpath = xpath.Replace("\"", "'");
            // Find matches
            var m = r.Match(xpath);
 
            var currentNode = elem;
            var currentPath = new StringBuilder();
 
            while (m.Success)
            {
                var currentXPath = m.Groups[0].Value;    // "/configuration" or "/appSettings" or "/add"
                var elementName = m.Groups[1].Value;     // "configuration" or "appSettings" or "add"
                var filterName = m.Groups[3].Value;      // "" or "key"
                var filterValue = m.Groups[4].Value;     // "" or "name"
                var attributeName = m.Groups[5].Value;   // "" or "value"
 
                var builder = currentPath.Append(currentXPath);
                var relativePath = builder.ToString();
                var newNode = (XNode)elem.XPathSelectElement(relativePath);
 
                if (newNode == null)
                {
                    if (!string.IsNullOrEmpty(attributeName))
                    {
                        ((XElement)currentNode).Attribute(attributeName).Value = "";
                        newNode = (XNode)elem.XPathEvaluate(relativePath);
                    }
                    else if (!string.IsNullOrEmpty(elementName))
                    {
                        var newElem = new XElement(elementName);
                        if (!string.IsNullOrEmpty(filterName))
                        {
                            newElem.Add(new XAttribute(filterName, filterValue));
                        }
 
                        ((XElement)currentNode).Add(newElem);
                        newNode = newElem;
                    }
                    else
                    {
                        throw new FormatException("The given xPath is not supported " + relativePath);
                    }
                }
 
                currentNode = newNode;
                m = m.NextMatch();
            }
Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.05.2014, 20:13
Ответы с готовыми решениями:

LINQ to XML или XPath to XML (выбор одного элемента)
Прошу помощи в LINQ или XPath запросе к XML Вот XML: &lt;manifest...

System.IO.File.Create не работает
Hello Проблема с таким куском кода System.IO.File.Exsist(string path) работает на ура, а System.IO.File.Create(string path) в упор не...

Удаление файла. File.Create() - File.Delete()
Добрый день! Не нашёл вразумительного ответа на свой вопрос. Создаю файл (File.Create()) и при моментальной попытке его удаления...

2
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.05.2014, 23:51
FeaRMysLF, имхо ваша проблема в регэкспах. В древовидных структурах вроде XML они бесполезны. Используйте объектную модель, а ля Elements/Descendants.
0
3 / 3 / 1
Регистрация: 29.08.2012
Сообщений: 24
08.05.2014, 00:57  [ТС]
Psilon, нет, в них никакой проблемы нет. Просто проблема в том, что каждый раз заново создаются все элементы. Например, вот функция записи:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        /// <summary>
        /// Writes the data to specified node
        /// </summary>
        /// <param name="value">Value to write</param>
        /// <param name="xpath">Node to read from</param>
        public void Write<TValue>(TValue value, string xpath)
        {
            var RootElement = "Settings";
            var tempElement = new XElement(RootElement);
            var tempNode = CreateNodeFromXPath(tempElement, xpath) as XElement;
            tempNode.SetValue(value);
 
            if (_xmlfile.XPathSelectElement(RootElement + xpath) == null)
                _xmlfile.Add(tempElement);
            else
                _xmlfile.XPathSelectElement(RootElement + xpath).SetValue(value);
        }
Write(Topmost, "/Window/Topmost");

Результат:
XML
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<Settings>
  <Window>
    <Topmost>true</Topmost>
  </Window>
</Settings>
Но если нужно добавить еще один элемент (пр Taskbar) в Window или в Settings, то выскочит InvalidOperation (неправильная структура файла) - из-за того, что CreateNodeFromXPath создаст элемент с такой структурой:
XML
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<Settings>
  <Window>
    <Taskbar>true</Taskbar>
  </Window>
</Settings>
Чтобы это исправить (изменить Write) нужно добавлять элементы напрямую в Settings, Window и прочее.

Все это нужно, т.к. в итоге функция Save (для настроек) очень сильно сокращается и можно сохранять каждое свойство в строку.

Если никто не поможет, то придется использовать обычную модель через XElement.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.05.2014, 00:57
Помогаю со студенческими работами здесь

Чтение XML через XDocument и формирование TreeView
Здравствуйте. Хочу считать xml файл и заполнить treeView в C#. using System; using System.Collections.Generic; using...

Create File txt with OpenFileDialog
Интересует это: Команда «Open...» выводит диалоговое окно OpenFileDialog; с его помощью можно выбирать не только существующие текстовые...

TFilestream.create [cannot create file]
function bat: string; begin with TFileStream.Create(extractfilepath(application.ExeName)+'bin\gcc\bin\compile.bat', fmCreate) do ...

Из List<string> в XDocument XML
Всем добрый день! Дан xml с настройками вида: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;dictionary&gt; &lt;el1&gt; ...

Caused by: android.view.InflateException: Binary XML file line #13: Binary XML file line #13: Error inflating class
Caused by: android.view.InflateException: Binary XML file line #13: Binary XML file line #13: Error inflating class...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru