# Elemente aus mehreren XML-Dateien zu einem zusammenfügen



## aracattack (5. Sep 2011)

Hallo,
was ich suche würde man vermutlich einen Parser nennen.. 
Ums vorneweg zu erklären, es geht um ein Spiel namens Aion.. bzw. Server-Files dafür^^

Ich habe im Client also ein XML-Dokument, das Informationen zu NPCs enthält.. das sieht in etwa so aus:
[XML]<id>258201</id>
<name>LF4_2111_Boss_Li_2</name>
<desc>STR_LF4_2111_Boss_Li_2</desc>
<dir>Monster/GodEliteLF</dir>
<mesh>GodEliteLF</mesh>
<material>mat_flesh</material>
<foot_mat>foot_2leg_big</foot_mat>
<show_dmg_decal>1</show_dmg_decal>
<dmg_decal_texture>Damage_Decal_02</dmg_decal_texture>
<disk_type>guard</disk_type>
<ui_type>monster_raid</ui_type>
<cursor_type>attack</cursor_type>
<ui_race_type>light</ui_race_type>
<hide_path>1</hide_path>
<fxc_type>Henchwoman</fxc_type>
<sanctuary_animation>sanctuary</sanctuary_animation>
<visible_equipments>
<main>npc_orb_lfgod_01</main>
</visible_equipments>
<erect>1</erect>
<bound_radius>
<front>8.000000</front>
<side>5.000000</side>
<upper>21.500000</upper>
</bound_radius>
<scale>20</scale>
<weapon_scale>100</weapon_scale>
<altitude>0.000000</altitude>
<stare_angle>0.000000</stare_angle>
<stare_distance>0.000000</stare_distance>
<move_speed_normal_walk>0.000000</move_speed_normal_walk>
<art_org_move_speed_normal_walk>0.000000</art_org_move_speed_normal_walk>
<move_speed_normal_run>0.000000</move_speed_normal_run>
<move_speed_combat_run>0.000000</move_speed_combat_run>
<art_org_speed_combat_run>0.000000</art_org_speed_combat_run>
<weapon_hit_fx>sys_Monhit.monhit.P_hit</weapon_hit_fx>
<ammo_hit_fx>m_abs_chief.point.hit</ammo_hit_fx>
<in_time>0.100000</in_time>
<out_time>0.500000</out_time>
<neck_angle>0.000000</neck_angle>
<spine_angle>0.000000</spine_angle>
<pushed_range>0.000000</pushed_range>
<hpgauge_level>27</hpgauge_level>
<magical_skill_boost>0</magical_skill_boost>
<attack_delay>2000</attack_delay>
<game_lang>light</game_lang>
<ai_name>LF4_GH</ai_name>
<quest_ai_name>LF4_2111_Boss_Li_2</quest_ai_name>
<tribe>Guard</tribe>
<race_type>GChief_Light</race_type>
<pet_ai_name>Pet</pet_ai_name>
<sensory_range>20.000000</sensory_range>
<attack_range>37.000000</attack_range>
<attack_rate>1000</attack_rate>
<npc_type>Abyss_Guard</npc_type>
<talking_distance>0.000000</talking_distance>
<abyss_npc_type>boss</abyss_npc_type>
</npc_client>[/XML]

am ende soll es in den serverdateien so aussehen:
[XML]    <npc_template npc_id="258201" level="27" name="enraged veille" name_id="320036" npc_type="ATTACKABLE" height="0.7" rank="NORMAL" race="GCHIEF_LIGHT" tribe="GUARD" ai="aggressive" srange="20" arange="37" adelay="2000" arate="1000" hpgauge="27">
        <stats maxHp="108" maxXp="108" block="100" parry="11" mdef="11" pdef="11" crit="11" power="11" evasion="11" accuracy="11" magic_accuracy="11" walk_speed="0.0" run_speed="0.0" run_speed_fight="0.0" fly_speed="0.0"/>
        <equipment>
            <item>100500746</item>
        </equipment>
        <bound_radius front="8.0" side="5.0" upper="21.5"/>
    </npc_template>[/XML]
die Schwierigkeit besteht eigendlich darin, dass einige Elemente in den Client-Files auf andere Dokumente verweisen (wie z.B. Items oder Beschreibungen)
und folglich erst aus den anderen Dokumenten herausgezogen werden müssen..
der Name z.B. kommt aus der Client_Strings.xml und der Eintrag sieht ungefähr so aus:
[XML]  <string>
    <id>320035</id>
    <name>STR_LF4_2111_Boss_Li_2</name>
    <body>Zorn-Veille</body>
  </string>[/XML]
also muss der Parser erst in der client_npcs.xml nach dem <name> bzw. <desc> suchen und den gleichen dann auch in der client_strings.xml und da den <body> dann in den Serverfiles als name="" angeben.
das Gleiche gilt für Items, die in der client_npcs.xml als <main> (für haupthand) <sub> (für nebenhand) etc. eingetragen sind und entsprechend der Beschreibung erst in der client_item.xml gesucht werden müssen, die so aussieht:
[XML]<id>100500746</id>
<name>npc_orb_lfgod_01</name>
<desc>STR_NPC_ORB_LFGOD_01</desc>
<weapon_type>2h_orb</weapon_type>
<item_type>normal</item_type>[/XML]
in diesem Fall soll der Parser in der client_npcs.xml erst nach <main>, <sub> oder <...> suchen, danach entsprechend in der client_items.xml das richtige item finden und <id> als <item> in die Serverfiles schreiben

Ich hoffe, ich hab das einigermaßen verständlich beschreiben >,<


Die meisten Elemente werden ja eigendlich 1 zu 1 übernommen^^

Da ich aber von Java viel zu wenig Ahnung habe um überhaupt einen Ansatz auf die Beine stellen zu können, frag ich euch^^

Hoffentlich kann mir da Jemand weiterhelfen und so einen Parser schreiben >,<

Vielen vielen Dank,
ara


----------



## DerEisteeTrinker (6. Sep 2011)

Reicht es vllt, wenn du die XML mit JAXB einliest, auf Objekt-Ebene mit Java-Mitteln zusammenwurstest und dann wieder per JAXB zu einem XML werden lässt?


----------



## aracattack (6. Sep 2011)

wenn du mir erklärst wie, bestimmt >,< ich könnte die zeilen bestimmt auch irgendwie per excel zusammenwursteln, damit kenn ich mich wenigstens genug aus^^ aber das wäre eine unschöne methode xD


----------



## DerEisteeTrinker (6. Sep 2011)

Schau mal hier nach, da findest ein Tutorial

Mit Excel kann man XML Dateien bearbeiten? Ich werd echt zu alt für die IT, da kommen echt die verrücktesten Dinge auf den Markt :shock:


----------



## aracattack (6. Sep 2011)

danke, ich guck das mal an^^ wenn ich nicht schlau(er) draus werde, meld ich mich sicher nochmal =)

und ja, man kann XML-Dateien auch mit Excel oder Calc (Open Office) ver!arbeiten^^ bearbeiten nicht, weil die das Format zerschießen zwechs der Zellen-Trennung^^ aber ich kann bei Calc z.B. ja eingeben, welches Zeichen als Trennung verwendet werden soll^^ nehme ich da jetzt < oder >, trennt der mir sauber alle tags auf^^ vorher noch das dokument in lauter Ein-Zeiler verwandeln, dann bekommt man eine saubere Tabelle^^ da muss man dann hald die einzelnen Elemente heruassammeln und dann via Script oder Formel in die richtige Reihenfolge bringen und voilla... fertig^^ so hab ichs vorher auch immer gemacht.. aber das ist viel zu umständlich... Ich hatte halt gehofft, jemand könnte kurz etwas für mich zusammenbasteln^^ aber ich werd erstmal selber versuchen


----------



## DerEisteeTrinker (6. Sep 2011)

Das Problem scheint nicht so groß zu sein, von daher setz dich lieber hin und mach es selber. Da lernst du noch was bei in Bezug auf XML.

Ich werd echt zu alt :lol: denn so eine umständliche Arbeit, wie du sie beschrieben hast, wäre mir schon zu viel. Da hab ich in der Zeit, wo ich mir das so zurechtgefuchst habe, schon das Programm geschrieben und die Unit-Tests fertig


----------

