Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   PHP (https://forum.zone-game.info/forumdisplay.php?f=125)
-   -   Парсер xml'ки (https://forum.zone-game.info/showthread.php?t=19758)

Shayne 02.05.2012 23:55

[Need help]Парсер xml'ки
 
Собственно имеем БД вида:
PHP код:

<?xml version="1.0" encoding="utf-8"?>
<list>
    <npc id="18910" name="Solina Knight Captain" title="">
        <set name="aggroRange" value="200" />
        <set name="ai_type" value="Fighter" />
        <set name="baseAtkRange" value="40" />
        <set name="baseCON" value="43" />
        <set name="baseCritRate" value="40" />
        <set name="baseDEX" value="30" />
        <set name="baseHpMax" value="3835.591" />
        <set name="baseHpRate" value="3" />
        <set name="baseHpReg" value="8.5" />
        <set name="baseINT" value="21" />
        <set name="baseMAtk" value="1457" />
        <set name="baseMAtkSpd" value="333" />
        <set name="baseMDef" value="494" />
        <set name="baseMEN" value="20" />
        <set name="baseMpMax" value="1777.4" />
        <set name="baseMpReg" value="3" />
        <set name="basePAtk" value="2250" />
        <set name="basePAtkSpd" value="253" />
        <set name="basePDef" value="609" />
        <set name="baseRunSpd" value="66" />
        <set name="baseSTR" value="40" />
        <set name="baseShldDef" value="0" />
        <set name="baseShldRate" value="0" />
        <set name="baseWIT" value="20" />
        <set name="baseWalkSpd" value="30" />
        <set name="collision_height" value="31.5" />
        <set name="collision_radius" value="14.0" />
        <set name="level" value="83" />
        <set name="rewardExp" value="44216" />
        <set name="rewardRp" value="0" />
        <set name="rewardSp" value="4545" />
        <set name="shots" value="NONE" />
        <set name="texture" value="LineageMonster5.solina_knight" />
        <set name="type" value="Monster" />
        <faction name="n_solina_clan" range="300"/>
        <skills>
            <skill id="4276" level="5" />    <!--Weak Point against Bow/Crossbow Weapons-->
            <skill id="4410" level="15" />    <!--Strong P. Atk.-->
            <skill id="4411" level="14" />    <!--Strong M. Atk.-->
            <skill id="4416" level="8" />    <!--Angels-->
            <skill id="5466" level="1" />    <!--Holy Attacks-->
            <skill id="5620" level="4" />    <!--Short-Range Physical Attack Weakness-->
            <skill id="6312" level="1" />    <!--Launch Sacred Sword Energy-->
            <skill id="6313" level="1" />    <!--Solina Bless-->
        </skills>
        <rewardlist type="RATED_GROUPED">
            <group chance="70.0">
                <reward item_id="57" min="1730" max="3492" chance="100.0000" />    <!--Adena-->
            </group>
            <group chance="1.3371">
                <reward item_id="14109" min="1" max="1" chance="0.0372" />    <!--Sealed Vesper Gauntlet-->
                <reward item_id="14113" min="1" max="1" chance="0.0372" />    <!--Sealed Vesper Leather Gloves-->
                <reward item_id="14116" min="1" max="1" chance="0.0372" />    <!--Sealed Vesper Gloves-->
                <reward item_id="14110" min="1" max="1" chance="0.0372" />    <!--Sealed Vesper Boots-->
                <reward item_id="14114" min="1" max="1" chance="0.0372" />    <!--Sealed Vesper Leather Boots-->
                <reward item_id="14117" min="1" max="1" chance="0.0372" />    <!--Sealed Vesper Shoes-->
                <reward item_id="15667" min="1" max="1" chance="16.6295" />    <!--Sealed Vesper Gauntlet Piece-->
                <reward item_id="15671" min="1" max="1" chance="16.6295" />    <!--Sealed Vesper Leather Gloves Piece-->
                <reward item_id="15674" min="1" max="1" chance="16.6295" />    <!--Sealed Vesper Gloves Piece-->
                <reward item_id="15668" min="1" max="1" chance="16.6295" />    <!--Sealed Vesper Boots Piece-->
                <reward item_id="15672" min="1" max="1" chance="16.6295" />    <!--Sealed Vesper Leather Boots Piece-->
                <reward item_id="15675" min="1" max="1" chance="16.6293" />    <!--Sealed Vesper Shoes Piece-->
            </group>
            <group chance="18.1342">
                <reward item_id="1895" min="1" max="1" chance="78.3705" />    <!--Metallic Fiber-->
                <reward item_id="4040" min="1" max="1" chance="5.4859" />    <!--Mold Lubricant-->
                <reward item_id="4042" min="1" max="1" chance="4.5716" />    <!--Enria-->
                <reward item_id="4043" min="1" max="1" chance="9.1432" />    <!--Asofe-->
                <reward item_id="10483" min="1" max="1" chance="1.9048" />    <!--Life Stone -  Level 82-->
                <reward item_id="10484" min="1" max="1" chance="0.4762" />    <!--Mid-Grade Life Stone -  Level 82-->
                <reward item_id="10485" min="1" max="1" chance="0.0478" />    <!--High-Grade Life Stone -  Level 82-->
            </group>
        </rewardlist>
        <rewardlist type="SWEEP">
            <reward item_id="15667" min="1" max="1" chance="1.3541" />    <!--Sealed Vesper Gauntlet Piece-->
            <reward item_id="15671" min="1" max="1" chance="1.3541" />    <!--Sealed Vesper Leather Gloves Piece-->
            <reward item_id="15674" min="1" max="1" chance="1.3541" />    <!--Sealed Vesper Gloves Piece-->
            <reward item_id="15668" min="1" max="1" chance="1.3541" />    <!--Sealed Vesper Boots Piece-->
            <reward item_id="15672" min="1" max="1" chance="1.3541" />    <!--Sealed Vesper Leather Boots Piece-->
            <reward item_id="15675" min="1" max="1" chance="1.3541" />    <!--Sealed Vesper Shoes Piece-->
            <reward item_id="15801" min="1" max="1" chance="0.1515" />    <!--Recipe - Sealed Vesper Gauntlet (60%) -->
            <reward item_id="15802" min="1" max="1" chance="0.1515" />    <!--Recipe - Sealed Vesper Leather Gloves (60%) -->
            <reward item_id="15803" min="1" max="1" chance="0.1515" />    <!--Recipe - Sealed Vesper Gloves (60%) -->
            <reward item_id="15804" min="1" max="1" chance="0.1515" />    <!--Recipe - Sealed Vesper Boots (60%) -->
            <reward item_id="15805" min="1" max="1" chance="0.1515" />    <!--Recipe - Sealed Vesper Leather Boots (60%) -->
            <reward item_id="15806" min="1" max="1" chance="0.1515" />    <!--Recipe - Sealed Vesper Shoes (60%) -->
        </rewardlist>
        <attributes>
            <attack attribute="holy" value="170" />
            <defence attribute="fire" value="200" />
            <defence attribute="water" value="200" />
            <defence attribute="wind" value="200" />
            <defence attribute="earth" value="150" />
            <defence attribute="holy" value="160" />
            <defence attribute="unholy" value="40" />
        </attributes>
        </npc>
</list>

Надо вытащить из нее дроп и привести к виду:
Код:

18900    Sealed Vesper Gauntlet 1-1  [1.3371 * 100 / 0.0372]
18900    Sealed Vesper Leather Gloves 1-1  [1.3371 * 100 / 0.0372]
и т.д.

Где 18900 - id моба (тег <npc id="xxx"...>)
Sealed Vesper Gauntlet - название предмета (тег <reward item_id="xxx"...>) - основная проблема почему создал тему, т.к. в самом теге нету названия итема есть только id. БД с id предметов тоже есть но как потом сопоставить... Понятия не имею. Либо вариант 2: вытаскивать из комментария справа.
1-1 - количество (тег <reward item_id="xxx" min="yyy" max="zzz">)
И еще одна вкусность - шанс составляется по формуле значение chance в теге <group chance="ххх"> умножить на 100 и делить на значение chance тега <reward item_id="" .... chance="yyy" />

P.S. Значения из тегов <set> доставал примерно так:
PHP код:

<?php
set_time_limit
(0);
$xml simplexml_load_file('1a.xml');

foreach (
$xml->xpath('/list/npc/set') as $set)
{
        if (
$set ["name"] == "aggroRange")
            echo 
$set ["value"];
}
?>

Но переделать под требуемое сейчас не смог...
P.S. Приму любую помощь. Cовет \ кусок кода \ куда копать \ готовый код О_О

Aquanox 03.05.2012 11:13

Re: Парсер xml'ки
 
как вариант

PHP код:

foreach($xml->npc as $npcElement) {
    foreach(
$npcElement->set as $setElement) {
        if (
$setElement->name == "aggroRange") {}
    }
    ...


http://php.net/manual/en/simplexml.examples-basic.php

Shayne 03.05.2012 11:39

Re: Парсер xml'ки
 
Ну так это аналогия моего кода для вытаскивания из тега <set>, а теперь мне надо иное. Как переделать пока не понимаю...

Aquanox 03.05.2012 16:02

Re: Парсер xml'ки
 
Вроде пример понятный был... вот детальнее

PHP код:

foreach($xml->npc as $npcElement) {
    
$npcId = (string)$npcElement["npc"];
    foreach(
$npcElement->rewardlist as $rewardListElement) {
          
$gChance = (string) $rewardListElement["chance"];
          foreach(
$rewardListElement as $groupElement) {
                foreach(
$groupElement->reward as $rewardElement) {
                   .... 
                   
                   
printf("%d %d... " $npcId, ... )
                }
          }
    }
    ...



Shayne 03.05.2012 17:24

Re: Парсер xml'ки
 
ооо, дошло, спасибо большое, дооформлю форматный вывод и выкину что вышло.
upd:
PHP код:

<?php
set_time_limit
(0);
$xml simplexml_load_file('18900-18999.xml');

foreach(
$xml->npc as $npcElement

    
$npcId = (string)$npcElement["id"]; 
    foreach(
$npcElement->rewardlist as $rewardListElement
    { 
        foreach(
$rewardListElement->group as $groupElement
            {
                
$gChance = (string)$groupElement["chance"]; 
                foreach(
$groupElement->reward as $rewardElement
                { 
                    
$rewardID = (string)$rewardElement["item_id"]; 
                    
$rewardMIN = (string)$rewardElement["min"]; 
                    
$rewardMAX = (string)$rewardElement["max"]; 
                    
$rewardCHANCE = (string)$rewardElement["chance"]; 
                    
$endCHANCE$gChance/100*$rewardCHANCE;
                    
printf("%d    %d    %d-%d    %6.4f</br>",$npcId$rewardID$rewardMIN$rewardMAX,$endCHANCE);
                } 
            } 
    } 

?>

осталось придумать как заменить id на название предмета...

Aquanox 04.05.2012 12:02

Re: Парсер xml'ки
 
Составь из клиентских данных таблицу код->название (распарсив itemname.dat etc) и поместив все это например в CSV, затем загружать в процессе работы для замены кода на название.

PHP код:

$nameData = array();
foreach(
loadCSV('names.csv') as $csvLine) {
  
$nameData[0] = $nameData[1];


...
$itemName $nameData[$rewardId];
... 


Shayne 04.05.2012 13:20

Re: Парсер xml'ки
 
Цитата:

Сообщение от Aquanox (Сообщение 185080)
Составь из клиентских данных таблицу код->название (распарсив itemname.dat etc) и поместив все это например в CSV

Сделал через эксель и парсеры тут в общем то не нужны...

Цитата:

Сообщение от Aquanox (Сообщение 185080)
затем загружать в процессе работы для замены кода на название.

PHP код:

$nameData = array();
foreach(
loadCSV('names.csv') as $csvLine) {
  
$nameData[0] = $nameData[1];


...
$itemName $nameData[$rewardId];
... 


А вот тут не осилил...

VISTALL 04.05.2012 14:47

Re: Парсер xml'ки
 
Цитата:

Сообщение от Shayne (Сообщение 185090)
Сделал через эксель и парсеры тут в общем то не нужны...


А вот тут не осилил...

я могу дать XML вид для itemname.dat

 
<out name="dec-ItemName-e.dat">
	<data>
		<item_id>17</item_id>
		<name>Wooden Arrow</name>
		<additionalname></additionalname>
		<popup>An arrow made of wood. It is an arrow used for a no grade bow.</popup>
		<description>-1</description>
		<unknown_1>0</unknown_1>
		<unknown_2>0</unknown_2>
		<set_enchant_count>0</set_enchant_count>
		<set_enchant_effect></set_enchant_effect>
		<color>1</color>
	</data>
 
Code: XML
дайте ток файлы

Shayne 04.05.2012 15:17

Re: Парсер xml'ки
 
Было бы очень кстати. Itemname-ru, Itemname-e

VISTALL 04.05.2012 15:41

Re: Парсер xml'ки
 
Цитата:

Сообщение от Shayne (Сообщение 185102)
Было бы очень кстати. Itemname-ru, Itemname-e

дайте датники плз


Текущее время: 06:32. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot