ugrás a tartalomhoz

Xml dokumentum és JQuery vs JS Osztály és saját funkciók

therest · 2012. Jan. 27. (P), 12.26
Mostanában gondolkozom azon, hogy írok egy bonyolultabb függvényt, ami xml dokumentumokat alakít át olyan alakra hogy a tulajdonságok elérhetőek legyenek "coverted.id" formában, és a gyermekek kezelése is könnyebb legyen, mint egy XML dokumentum esetében. Lényegében egy osztály példányait tömbökbe rendezve.

Az egész témával kapcsolatban sokat rágódtam, hogy van-e értelme így átkonvertálni, hiszen az átalakítás annyi időt vesz el, hogy nem biztos hogy megéri, még akkor sem ha később könnyben, gyorsabban lehet matatni a struktúrán.

További ellenérvként ott a jQuery eszközrendszere, ami biztosítja a xml kezelését.

Konkrétan: XML jön AJAXon keresztül, mondjuk egy raktár vagy webshop árukészlete, 1000-10.000 elem. Ezeken az elemeken a szokásos műveletek végezhetőek,(módosítás, törlés), amihez a fában meg kell találni az adott elemet. A gyermekelemek elérése is szükséges olykor. Tartsam ezt XML-ben kliensoldalon, és jQueryvel(vagy saját függvénnyel) keressem benne ami kell (pl egy adott id-jű elemet), vagy inkább rakjam át saját struktúrába?

Az adatok újratöltésének gyakoriságát, megsaccolni sem tudom, értelemszerűen csak akkor történik ilyen ha elnavigál az adott oldalról, majd visszatér, egyébként minden AJAX-al történik.

Mi lenne itt a legjobb megoldás, elsősorban a kód sebessége, másodsorban, a kód átláthatósága, és nem utolsó sorban általánossága, újrafelhasználhatósága szempontjából?
 
1

XSLT

Hidvégi Gábor · 2012. Jan. 27. (P), 12.29
XSLT
2

Nem ismerem, de a w3scoolsos

therest · 2012. Jan. 27. (P), 13.21
Nem ismerem, de a w3scoolsos info alapján ez az adatok alapján való dokumentumépítésben effektív lehet, de engem inkább az XML-ben érkezett adatok, módosításánál, törlésénél érdekelne a legeffektívebb módszer, mert onnan vissza is kell pakolni az adatbázisba.
Még utána olvasok a témának, érdekes.
3

Az XML-ből XSLT segítségével

Hidvégi Gábor · 2012. Jan. 27. (P), 13.28
Az XML-ből XSLT segítségével tudsz HTML-t generálni, az XPATH arra jó, hogy az XML-ben adatokat keress, DOM metódusokkal pedig közvetlenül tudod manipulálni azokat.

Viszont az XML nem igazán hatékony ekkora mennyiségű adatok tárolására, erről nemrég volt fórumtéma, ehhez lassú, és szerveroldalon rengeteg memóriát igényel.
4

Az adatok szerver oldalon

therest · 2012. Jan. 27. (P), 13.46
Az adatok szerver oldalon adatbázisban vannak, egy php script tér vissza az xml-el az ajaxos kérés során. Milyen más módszer elképzelhető itt ami jobb? Formátum szintjén esetleg JSON lehetne, de a teljes igazság az, hogy a jelen projektben a php nem fér közvetlenül az adatbázishoz, hanem egyéb webservicek-hez kapcsolódik, és onnan fixen xml jön, third party, nem tudok rajta változtatni.
7

JSON

Poetro · 2012. Jan. 27. (P), 14.18
Mondjuk a JSON sokkal hasznosabb formátum lenne, mert kisebb, kevesebb memóriát fogyaszt, és könnyebb manipulálni. És természetesen szerver oldalon simán JSON-ná lehet alakítani a bejövő XML adatokat, van rá pár osztály, ami megcsinálja neked ezt. Sőt a PHP-ba épített XML Parser is meg tudja neked ezt csinálni a xml_parse_into_struct függvény segítségével.
A felhasználói hozzászólások közül jemptymethod és a korrekciót összeollózva itt egy kész megoldás:
<?php
function xml_parse_into_assoc($file) {
  $data = implode("", file($file));
  $p = xml_parser_create();
  xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
  xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
  xml_parse_into_struct($p, $data, $vals, $index);
  xml_parser_free($p);
  $levels = array(
    null
  );
  foreach ($vals as $val) {
    if ($val['type'] == 'open' || $val['type'] == 'complete') {
      if (!array_key_exists($val['level'], $levels)) {
        $levels[$val['level']] = array();
      }
    }
    $prevLevel = & $levels[$val['level'] - 1];
    $parent = $prevLevel[sizeof($prevLevel) - 1];

    if ($val['type'] == 'open') {
      $val['children'] = array();
      array_push(&$levels[$val['level']], $val);
      continue;
    } elseif ($val['type'] == 'complete') {
      $parent['children'][$val['tag']] = $val['value'];
    } elseif ($val['type'] == 'close') {
      $pop = array_pop($levels[$val['level']]);
      $tag = $pop['tag'];

      if ($parent) {
        if (!array_key_exists($tag, $parent['children'])) {
          $parent['children'][$tag] = $pop['children'];
        } elseif (is_array($parent['children'][$tag])) {
          if(!isset($parent['children'][$tag][0])) {
            $oldSingle = $parent['children'][$tag];
            $parent['children'][$tag] = null;
            $parent['children'][$tag][] = $oldSingle;
          }
          $parent['children'][$tag][] = $pop['children'];
        }
      } else {
        return (array(
          $pop['tag'] => $pop['children']
        ));
      }
    }
    $prevLevel[sizeof($prevLevel) - 1] = $parent;
  }
}
echo json_encode(xml_parse_into_assoc('user_feed.xml'));
?>
Persze ez fájlokkal dolgozik, de kb. fél perc stringekre átírni.
Sőt találtam egyet, ami SimpleXML-t használ, és talán megbízhatóbb is.
9

Ezen persze én is

therest · 2012. Jan. 27. (P), 14.29
Ezen persze én is gondolkodtam, de A kérdés az, hogy ez az átalakítás mennyi erőforrást emészt fel szerveroldalon. megéri így konvertálni, amikor az adatok feldolgozása úgyis a kliensnél történik meg?
11

Natívan

Poetro · 2012. Jan. 27. (P), 14.31
Ahogy most megtalálta, a SimpleXML natívan támogatja az objektummá alakítást:
file_put_contents(
  'user_feed.json', 
  json_encode(
    simplexml_load_string(
      file_get_contents('user_feed.xml')
    )
  )
);
Ugyanakkor ebben az esetben nem támogat névtereket.
10

Mondjuk a JSON sokkal

Hidvégi Gábor · 2012. Jan. 27. (P), 14.30
Mondjuk a JSON sokkal hasznosabb formátum lenne, mert kisebb, kevesebb memóriát fogyaszt, és könnyebb manipulálni.
XML-hez pedig van XPATH, amit a böngészők és szerveroldali XML parserek natívan támogatnak. Emellett bizonyos adatformátumokat csak körülményesen lehet megoldani JSON-nal:
<fejlec att="1" att2="2">
  <gyerek att3="3">érték</gyerek>
</fejlec>
8

Akkor marad az XPATH és a

Hidvégi Gábor · 2012. Jan. 27. (P), 14.20
Akkor marad az XPATH és a DOM.
5

jQuery + saját osztály

Poetro · 2012. Jan. 27. (P), 13.49
Én írnék egy saját osztályt, ami jQuery segítségével megcsinálná a keresést és manipulációt. Egy ilyennek a megírása nem olyan nagy munka.
6

Ezek szerint Te arra

therest · 2012. Jan. 27. (P), 14.05
Ezek szerint Te arra szavazol, hogy 5-10k adattag esetében kliensoldalon bent lehet hagyni xml-ben az adatot, és azon keresni, manipulálni.
12

10-es, és 11-es postok: mind

therest · 2012. Jan. 27. (P), 14.53
10-es, és 11-es postok: mind a kettő érdekes, de ahogy látom, akkor nincs igazán olyan álláspont, ami egyértelműen a többi felett áll, mert annyival jobb.

A XPATH használata minden böngészőben ugyan az, vagy itt is komoly eltérések vannak vannak típusonként, verziónként? Mert oké, hogy natívan támogatja, de ha le kell kezelni az különböző verzókat, akkor az nyűgös.
14

A régebbi Internet Explorerek

Hidvégi Gábor · 2012. Jan. 27. (P), 15.24
A régebbi Internet Explorerek máshogy kezelik az XPATH-ot, a többi böngésző viszont szabványosan, de mivel ez egy adminisztrációs felület, előírhatod, hogy milyen szoftvert használhatnak. Az XML-ben DOM metódusokat tudsz használni, pl. getElementsByTagName, replaceChild és társaik, továbbá akár kliens-, akár pedig szerveroldalon XSLT segítségével HTML-t vagy egyéb adatformátumot tudsz belőle generálni.
13

A XPATH használata minden

Poetro · 2012. Jan. 27. (P), 15.06
A XPATH használata minden böngészőben ugyan az, vagy itt is komoly eltérések vannak vannak típusonként, verziónként?

Nem, sajnos nem ugyanaz. Ezért is talán kicsit bonyolultabb a használata böngészőben.
17

XSLT az szabvány, amit

inf · 2012. Jan. 28. (Szo), 14.52
XSLT az szabvány, az XPATH-hez meg érdemes keretrendszert használni.
15

Én nem konvertálnám semmire,

Karvaly84 · 2012. Jan. 27. (P), 15.48
Én nem konvertálnám semmire, hanem xpath-al navigálnék az elemeken.
16

Ja hogy már ti ki is

Karvaly84 · 2012. Jan. 27. (P), 15.50
Ja hogy már ti ki is beszéltétek a xpath-ot? mért nem olvasok előbb mi? :D