Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/50: Рейтинг темы: голосов - 50, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 15.08.2011
Сообщений: 17

XML Поиск элемента по атрибуту и запись в новый файл

15.12.2012, 22:19. Показов 10211. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Пишу программу которая будет в xml искать элемент по значению атрибута и результат будет заносить заносить в новый файл.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
     ArrayList orders = new ArrayList();
            orders.Add("100001405");
            orders.Add("100001406");
            // Load the document and set the root element.
            XmlDocument doc = new XmlDocument();
            doc.Load("lex1.xml");
            XmlNode root = doc.DocumentElement;
            string FilePath = @"123.xml";
            // Add the namespace.
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
            for (int i = 0; i < orders.Count; i++)
            {
                XmlNodeList nodeList = root.SelectNodes(".//item_template[@id=\""+ orders[i] + "\"]", nsmgr);
                Console.WriteLine(orders[i]);
            }
            doc.Save(FilePath);
            // Display the updated document.
            Console.ReadLine();
XML
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
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<item_templates>
        <item_template id="100001405" name="world cash Gulare's Sword" level="60" mask="7240" category="SWORD" weapon_type="SWORD_1H" max_stack_count="1" item_type="NORMAL" quality="EPIC" price="3665400" race="PC_ALL" option_slot_bonus="0" restrict="60,60,60,60,60,60,60,60,60,60,60,60" restrict_max="63,63,63,63,63,63,63,63,63,63,63,63" desc="1604073" attack_gap="0.0" attack_type="PHYSICAL" slot="3" equipment_type="WEAPON">
        <modifiers>
            <add name="MAXHP" value="508" bonus="true"/>
            <add name="PHYSICAL_ACCURACY" value="142" bonus="true"/>
            <add name="PHYSICAL_ATTACK" value="35" bonus="true"/>
            <rate name="ATTACK_SPEED" value="-19" bonus="true"/>
        </modifiers>
        <weapon_stats hit_count="2" attack_range="4000" magical_accuracy="331" parry="1014" physical_accuracy="976" physical_critical="50" attack_speed="1400" max_damage="225" min_damage="183"/>
    </item_template>
        <item_template id="100001406" name="world cash Gulare's Sword" level="60" mask="7240" category="SWORD" weapon_type="SWORD_1H" max_stack_count="1" item_type="NORMAL" quality="EPIC" price="3665400" race="PC_ALL" option_slot_bonus="0" restrict="60,60,60,60,60,60,60,60,60,60,60,60" restrict_max="63,63,63,63,63,63,63,63,63,63,63,63" desc="1604073" attack_gap="0.0" attack_type="PHYSICAL" slot="3" equipment_type="WEAPON">
        <modifiers>
            <add name="MAXHP" value="508" bonus="true"/>
            <add name="PHYSICAL_ACCURACY" value="142" bonus="true"/>
            <add name="PHYSICAL_ATTACK" value="35" bonus="true"/>
            <rate name="ATTACK_SPEED" value="-19" bonus="true"/>
        </modifiers>
        <weapon_stats hit_count="2" attack_range="4000" magical_accuracy="331" parry="1014" physical_accuracy="976" physical_critical="50" attack_speed="1400" max_damage="225" min_damage="183"/>
    </item_template>
        <item_template id="100001407" name="world cash Gulare's Sword" level="60" mask="7240" category="SWORD" weapon_type="SWORD_1H" max_stack_count="1" item_type="NORMAL" quality="EPIC" price="3665400" race="PC_ALL" option_slot_bonus="0" restrict="60,60,60,60,60,60,60,60,60,60,60,60" restrict_max="63,63,63,63,63,63,63,63,63,63,63,63" desc="1604073" attack_gap="0.0" attack_type="PHYSICAL" slot="3" equipment_type="WEAPON">
        <modifiers>
            <add name="MAXHP" value="508" bonus="true"/>
            <add name="PHYSICAL_ACCURACY" value="142" bonus="true"/>
            <add name="PHYSICAL_ATTACK" value="35" bonus="true"/>
            <rate name="ATTACK_SPEED" value="-19" bonus="true"/>
        </modifiers>
        <weapon_stats hit_count="2" attack_range="4000" magical_accuracy="331" parry="1014" physical_accuracy="976" physical_critical="50" attack_speed="1400" max_damage="225" min_damage="183"/>
    </item_template>
</item_templates>
Но у меня почему то в файл записываются все элементы заново а не элементы которые он должен был найти.
Помогите в чем проблема спасибо.

Добавлено через 5 часов 9 минут
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
            ArrayList orders = new ArrayList();
            orders.Add("100001405");     //id
            orders.Add("100001406");     //id
            XmlDocument doc = new XmlDocument();
            doc.Load("lex1.xml");
            XmlNode root = doc.DocumentElement;
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
            try
            {
                //ArrayList orders = new ArrayList() { 100001407 };
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < orders.Count; i++)
                {
                   
                    XDocument doc1 = XDocument.Load("123.xml");
                    string s = Convert.ToString(orders[i]);
                    Console.WriteLine(s);
                    var q = from node in doc1.Descendants("item_template") let attr = node.Attribute("id") where attr != null & attr.Value == s select node;                    
                    doc1.Save("123.xml");
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("The file could not be read:");
                Console.WriteLine(e.Message);
            }
            Console.ReadLine();
Пробовал так тоже не работает переписывает весь файл =(
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.12.2012, 22:19
Ответы с готовыми решениями:

Поиск по атрибуту тега XML
Здравствуйте, нужна ваша помощь. У меня есть сохраненный XML документ с такими вот элементами &lt;?xml version=&quot;1.0&quot;...

LINQ to XML - поиск по атрибуту
Здравствуйте хотелось бы попросить помощи в одном вопросе. Есть XML файл, записываю в него данные так: XDocument doc = new...

Поиск по числовому XML атрибуту
на msdn нашел пример поиск элемента по, атрибуту. XElement root = XElement.Load(&quot;PurchaseOrder.xml&quot;); IEnumerable&lt;XElement&gt;...

8
7 / 7 / 1
Регистрация: 02.05.2012
Сообщений: 26
16.12.2012, 03:05
C#
1
2
3
4
5
6
7
8
9
10
11
doc.Load("lex1.xml"); //тут вы загрузили ваш документ
XmlNode root = doc.DocumentElement;
string FilePath = @"123.xml";
// Add the namespace.
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
for (int i = 0; i < orders.Count; i++)
{
   XmlNodeList nodeList = root.SelectNodes(".//item_template[@id=\""+ orders[i] + "\"]", nsmgr);
   Console.WriteLine(orders[i]);
}
doc.Save(FilePath); //а здесь, не внеся в него никаких изменений, сохранили
Аналогично:

C#
1
2
3
4
5
XDocument doc1 = XDocument.Load("123.xml"); //открыли документ
string s = Convert.ToString(orders[i]);
Console.WriteLine(s);
var q = from node in doc1.Descendants("item_template") let attr = node.Attribute("id") where attr != null & attr.Value == s select node; //эту строку я не особо понимаю, т.к. с xml-парсингом не работал                 
doc1.Save("123.xml"); //ничего с ним не сделали и сохранили

Сохраняйте необходимые вам полученные при парсинге данные, а не открытый неизменный документ
0
0 / 0 / 0
Регистрация: 15.08.2011
Сообщений: 17
16.12.2012, 15:37  [ТС]
Хм. А как сохранить эти данные вот я не могу понять Уже 3 день сижу.... где ошибка.... как сделать...

Добавлено через 11 часов 54 минуты
Уважаемые помогите пожалуйста как сделать чтоб работало как я хотел?!
0
7 / 7 / 1
Регистрация: 02.05.2012
Сообщений: 26
16.12.2012, 16:29
Что конкретно вы хотите вытащить из этого XML? Укажите строки/значения/что бы то ни было еще.
0
0 / 0 / 0
Регистрация: 15.08.2011
Сообщений: 17
16.12.2012, 17:13  [ТС]
Берет из массива значения и создает запрос для поиска в xml файле узла соответствующий критериям и копирует его полностью в новый файл.
XML
1
2
3
4
5
6
7
8
<item_template id="1">
<b>ТЕКСТ</b>
idc="2"/>
</item_template>
<item_template id="2">
<b>ТЕКСТ</b>
idc="3"/>
</item_template>
Ищем Элемент item_template с атрибутом "id" и значение "1" (Оно берется из ArrayList) => Нашли узел => скопировали в новый файл, Перешли к следующем значению из массива. На выходе должен получиться файл с узлами item_template и со всеми дочерними узлами которые были найдены в xml по заданным критериям.
0
7 / 7 / 1
Регистрация: 02.05.2012
Сообщений: 26
16.12.2012, 17:28
Не совсем понял, что именно вы хотите вытащить, посему пришлось делать двойную работу.
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
 
namespace ConsoleApplication1
{
    class Program
    {
        static string[] search_keys = { "100001405", "100001406" };
        static List<States> states;
 
        struct States
        {
            string name, value;
            bool bonus;
 
            public States(string name_t, string value_t, bool bonus_t)
            {
                name = name_t;
                value = value_t;
                bonus = bonus_t;
            }
 
            public string Name
            {
                get { return this.name; }
                set { name = value; }
            }
 
            public string Value
            {
                get { return this.value; }
                set { this.value = value; }
            }
 
            public bool Bonus
            {
                get { return bonus; }
                set { bonus = value; }
            }
        }
 
        static void GetInnerNodeXML()
        {            
            XmlDocument doc = new XmlDocument();
            doc.Load("D:\\xml.xml");
            XmlNode root_node = doc.DocumentElement;
            XmlNamespaceManager namespace_manager = new XmlNamespaceManager(doc.NameTable);
 
            foreach (string key in search_keys)
            {
                XmlNode node = root_node.SelectSingleNode(".//item_template[@id=\"" + key + "\"]", namespace_manager);
                Console.WriteLine("Inner node xml: " + node.InnerXml);
                Console.WriteLine();
            }
        }
 
        static void GetEveryState()
        {            
            XmlDocument doc = new XmlDocument();
            doc.Load("D:\\xml.xml");
            XmlNode root_node = doc.DocumentElement;
            XmlNamespaceManager namespace_manager = new XmlNamespaceManager(doc.NameTable);
 
            foreach (string key in search_keys)
            {
                Console.WriteLine("Getting attributes for search key_value " + key + " ...");
                Console.WriteLine();
                states = new List<States>();
 
                XmlNode parent_node = root_node.SelectSingleNode(".//item_template[@id=\"" + key + "\"]", namespace_manager);
                {
                    foreach (XmlNode child_node_level1 in parent_node.ChildNodes)
                    {
                        if (child_node_level1.Name == "modifiers")
                        {
                            foreach (XmlNode child_node_level2 in child_node_level1.ChildNodes)
                            {
                                states.Add(new States(child_node_level2.Attributes[0].Value, child_node_level2.Attributes[1].Value, bool.Parse(child_node_level2.Attributes[2].Value)));
                            }
                        }
                    }
                }
 
                for(int i = 0; i < states.Count; i++)
                {                    
                    Console.WriteLine("#" + i + " states");
                    Console.WriteLine("Attribute_name: " + states[i].Name);
                    Console.WriteLine("Attribute_value: " + states[i].Value);
                    Console.WriteLine("Is_active_bonus: " + states[i].Bonus.ToString());
                    Console.WriteLine();
                }
            }
        }
 
 
        static void Main(string[] args)
        {
            GetInnerNodeXML();
            Console.WriteLine();
            GetEveryState();
            Console.Read();
        }
    }
}
Метод GetInnerNodeXML() вытаскивает весь XML-текст между каждым узлом с именем "item_template" и выводит на консоль. Перепишите как хотите. Хотите - прикрепите к нему XML родительской ноды - никто вам не мешает. Я думаю, разберетесь. Далее вам останется только прикрепить текст к строке и записать в файл.

Метод GetEveryState() вытаскивает конкретные значения конкретных атрибутов нод. Хотите - возьмите массив states, опять же прикрепите значения к строке и запишите в файл. Если вам нужен был первый метод - все равно взгляните на второй, чтобы понять как проходить по структуре дерева XML и доставать то или иное значение.

P.S. мне хватило часа, чтобы с нуля разобраться
1
0 / 0 / 0
Регистрация: 15.08.2011
Сообщений: 17
16.12.2012, 17:59  [ТС]
Спасибо пойду перерабатывать. Вытащить нужно был весь узел с дочерними узлами со всеми элементами и атрибутами.

XML
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
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<item_templates>
        <item_template id="100001405" name="world cash Gulare's Sword" level="60" mask="7240" category="SWORD" weapon_type="SWORD_1H" max_stack_count="1" item_type="NORMAL" quality="EPIC" price="3665400" race="PC_ALL" option_slot_bonus="0" restrict="60,60,60,60,60,60,60,60,60,60,60,60" restrict_max="63,63,63,63,63,63,63,63,63,63,63,63" desc="1604073" attack_gap="0.0" attack_type="PHYSICAL" slot="3" equipment_type="WEAPON">
        <modifiers>
            <add name="MAXHP" value="508" bonus="true"/>
            <add name="PHYSICAL_ACCURACY" value="142" bonus="true"/>
            <add name="PHYSICAL_ATTACK" value="35" bonus="true"/>
            <rate name="ATTACK_SPEED" value="-19" bonus="true"/>
        </modifiers>
        <weapon_stats hit_count="2" attack_range="4000" magical_accuracy="331" parry="1014" physical_accuracy="976" physical_critical="50" attack_speed="1400" max_damage="225" min_damage="183"/>
    </item_template>
        <item_template id="100001406" name="world cash Gulare's Sword" level="60" mask="7240" category="SWORD" weapon_type="SWORD_1H" max_stack_count="1" item_type="NORMAL" quality="EPIC" price="3665400" race="PC_ALL" option_slot_bonus="0" restrict="60,60,60,60,60,60,60,60,60,60,60,60" restrict_max="63,63,63,63,63,63,63,63,63,63,63,63" desc="1604073" attack_gap="0.0" attack_type="PHYSICAL" slot="3" equipment_type="WEAPON">
        <modifiers>
            <add name="MAXHP" value="508" bonus="true"/>
            <add name="PHYSICAL_ACCURACY" value="142" bonus="true"/>
            <add name="PHYSICAL_ATTACK" value="35" bonus="true"/>
            <rate name="ATTACK_SPEED" value="-19" bonus="true"/>
        </modifiers>
        <weapon_stats hit_count="2" attack_range="4000" magical_accuracy="331" parry="1014" physical_accuracy="976" physical_critical="50" attack_speed="1400" max_damage="225" min_damage="183"/>
    </item_template>
        <item_template id="100001407" name="world cash Gulare's Sword" level="60" mask="7240" category="SWORD" weapon_type="SWORD_1H" max_stack_count="1" item_type="NORMAL" quality="EPIC" price="3665400" race="PC_ALL" option_slot_bonus="0" restrict="60,60,60,60,60,60,60,60,60,60,60,60" restrict_max="63,63,63,63,63,63,63,63,63,63,63,63" desc="1604073" attack_gap="0.0" attack_type="PHYSICAL" slot="3" equipment_type="WEAPON">
        <modifiers>
            <add name="MAXHP" value="508" bonus="true"/>
            <add name="PHYSICAL_ACCURACY" value="142" bonus="true"/>
            <add name="PHYSICAL_ATTACK" value="35" bonus="true"/>
            <rate name="ATTACK_SPEED" value="-19" bonus="true"/>
        </modifiers>
        <weapon_stats hit_count="2" attack_range="4000" magical_accuracy="331" parry="1014" physical_accuracy="976" physical_critical="50" attack_speed="1400" max_damage="225" min_damage="183"/>
    </item_template>
</item_templates>
На выходе должно быть как то так.

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<item_templates>
        <item_template id="100001405" name="world cash Gulare's Sword" level="60" mask="7240" category="SWORD" weapon_type="SWORD_1H" max_stack_count="1" item_type="NORMAL" quality="EPIC" price="3665400" race="PC_ALL" option_slot_bonus="0" restrict="60,60,60,60,60,60,60,60,60,60,60,60" restrict_max="63,63,63,63,63,63,63,63,63,63,63,63" desc="1604073" attack_gap="0.0" attack_type="PHYSICAL" slot="3" equipment_type="WEAPON">
        <modifiers>
            <add name="MAXHP" value="508" bonus="true"/>
            <add name="PHYSICAL_ACCURACY" value="142" bonus="true"/>
            <add name="PHYSICAL_ATTACK" value="35" bonus="true"/>
            <rate name="ATTACK_SPEED" value="-19" bonus="true"/>
        </modifiers>
        <weapon_stats hit_count="2" attack_range="4000" magical_accuracy="331" parry="1014" physical_accuracy="976" physical_critical="50" attack_speed="1400" max_damage="225" min_damage="183"/>
    </item_template>
        <item_template id="100001406" name="world cash Gulare's Sword" level="60" mask="7240" category="SWORD" weapon_type="SWORD_1H" max_stack_count="1" item_type="NORMAL" quality="EPIC" price="3665400" race="PC_ALL" option_slot_bonus="0" restrict="60,60,60,60,60,60,60,60,60,60,60,60" restrict_max="63,63,63,63,63,63,63,63,63,63,63,63" desc="1604073" attack_gap="0.0" attack_type="PHYSICAL" slot="3" equipment_type="WEAPON">
        <modifiers>
            <add name="MAXHP" value="508" bonus="true"/>
            <add name="PHYSICAL_ACCURACY" value="142" bonus="true"/>
            <add name="PHYSICAL_ATTACK" value="35" bonus="true"/>
            <rate name="ATTACK_SPEED" value="-19" bonus="true"/>
        </modifiers>
        <weapon_stats hit_count="2" attack_range="4000" magical_accuracy="331" parry="1014" physical_accuracy="976" physical_critical="50" attack_speed="1400" max_damage="225" min_damage="183"/>
    </item_template>
.........
........
........
</item_templates>
0
7 / 7 / 1
Регистрация: 02.05.2012
Сообщений: 26
16.12.2012, 18:13
В таком случае ваша задача упрощается до:
C#
1
2
3
4
5
6
7
8
static void GetInnerNodeXML()
{            
    XmlDocument doc = new XmlDocument();
    doc.Load("D:\\xml.xml"); //тут путь к вашему файлу
    XmlNode root_node = doc.DocumentElement;
    XmlNode node = root_node.SelectSingleNode("//item_templates");
    File.WriteAllText("D:\\newxml.xml", node.OuterXml);          
}
P.S. Для "Спасибо" существует кнопочка

P.P.S: не забудьте включить System.IO в директивах using
1
0 / 0 / 0
Регистрация: 15.08.2011
Сообщений: 17
16.12.2012, 18:54  [ТС]
Спасибо выручили.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2012, 18:54
Помогаю со студенческими работами здесь

XML. Поиск узла по известному атрибуту
Хочу вывести определенный Caption в зависимости от ID, как это сделать? Хотя бы в двух словах. &lt;?xml version=&quot;1.0&quot;...

Поиск узла по атрибуту с помощью LINQ to XML
Как найти узел по атрибуту и удалить? Как найти узел по атрибуту и изменить значения в дочерних елементах? через linq

Поиск элемента в массиве и запись информации в файл
9. Напишите программу, которая проверяет, есть ли в массиве элементы с таким же значением как и вводимое число с клавиатуры. ...

Получаю xml по url, как сохранить содержимое в новый xml файл, только чтобы структура не нарушилась?
Когда делаю так, структура нарушается WebRequest request =...

Запись XML-дерева сразу в xml-файл (парсер JAXP)
Народ!Программеры!Помогите человеку,плиз! Парсерю я xml-файл,через DOM-модель,использую JAXP.После модификации надо все дерево записать в...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru