Перейти к содержанию

Рекомендуемые сообщения

Доброго времени суток.

Имеется файл следующего содержания:

<clientzones>
<subzones>
<subzone>
<name>STR_AbProD2_SZ_B</name>
<priority>16</priority>
<string>STR_AbProD2_SZ_B</string>
<breath_area>FALSE</breath_area>
<power_area>FALSE</power_area>
<ui_map>main</ui_map>
<fatigue_korea>FALSE</fatigue_korea>
<points_info>
<type>polygon</type>
<points>
<npc_info>
<movetype>false</movetype>
<nameid>798356</nameid>
<pos>
<x>417.244720</x>
<y>357.266296</y>
<z>231.750000</z>
</pos>
</npc_info>
<npc_info>
<movetype>false</movetype>
<nameid>798356</nameid>
<pos>
<x> 377.244720</x>
<y> 312.016296</y>
<z>221.000000</z>
</pos>
</npc_info>
</points>
<bottom>0.100000</bottom>
<top>500.100000</top>
</points_info>
</subzone>
</subzones>
</clientzones>

Нужно из этого файла вытащить id, x/y/z координаты и записать следующим образом в новый файл


<spawns>
<spawn map="NEW-IDABPROD3" npcid="798356" pool="2" interval="105">
<object x="417.244720" y="357.266296" z="231.750000" h="0" />
<object x="377.244720" y="312.016296" z="221.000000" h="0" />
</spawn>
</spawns>

*параметр pool - количество координат, а h, interval и map - статичны

Не откажусь от примера кода или ссылок на литературу, в которой можно про это почитать

Ссылка на комментарий
Поделиться на другие сайты

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

можно пример, пусть даже не для предложенного примера, а полегче, чтобы понять логику выполнения?

Ссылка на комментарий
Поделиться на другие сайты

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

можно пример, пусть даже не для предложенного примера, а полегче, чтобы понять логику выполнения?

Не существует библиотек облегчающих эту задачу (хотя на C# это проще простого).

Ссылка на комментарий
Поделиться на другие сайты

хм, видно я ошибся.

На сишарпе - да, даже есть пример хороший, но я хочу на плюсах.

Но не приложу ума как

Думаю тебе придётся воспользоваться регулярными выражениями.

Ссылка на комментарий
Поделиться на другие сайты

Проект codeproject содержит огромное количество статей с примерами разных задач. По ссылке пример XML разметки и извлечения данных из документа xml на C++.

Ссылка на комментарий
Поделиться на другие сайты

Проект codeproject содержит огромное количество статей с примерами разных задач. По ссылке пример XML разметки и извлечения данных из документа xml на C++.

Копия того, что я видел на C#.

P.S. я думал что он хочет сам свой парсер написать.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Так и быть помогу)))

Вообщем :


#include <Windows.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
string path = ("test.xml");
ifstream f(path);
string s;
string out ("go.xml" );
ofstream f2(out);
while(!f.eof())
{
f >> s;
if(s.find("<nameid>")<s.size())
{
f2 << s << endl;
f >> s;
}

if(s.find("<x>")<s.size())
{
f2 << s << endl;
f >> s;
}

if(s.find("<y>")<s.size())
{
f2 << s << endl;
f >> s;
}

if(s.find("<z>")<s.size())
{
f2 << s << endl;
f >> s;
}

}
f.close();
f2.close();
}

test.xml - input

go.xml - output

Вывод:


<nameid>798356</nameid>
<x>417.244720</x>
<y>357.266296</y>
<z>231.750000</z>

​А вот ещё на калякал :D :


#include <Windows.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
string infa[100];
int i = 0;
string line;
string path = ("test.xml");
string out = ("go.xml");
ofstream v(out);
ifstream f(path.c_str());
while(f.good())
{
getline(f,line);
infa[i] = line;
i++;
}
f.close();
v << infa[15] << "\n" << infa[17] << "\n" << infa[18] << "\n" << infa[19];
v.close();
}

Вывод как и вверху.

Но тут уже зависит от линии, какая она стоит по счету)))

Конечно за тебя все не буду делать)) но думаю достаточно что бы понять.

И опять же не какие парсеры не нужны : :-P

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.