Autor Zpráva
bagocina
Profil
Ahojte

Chcel by som vás poprosiť o radu.

Mám rozsah IDčiek vo foreach. Tie sú dosadzovanie následne do linkov, ktoré otvárajú cez SimpleXML súbory typu XML. Z nich chcem vyťahovať rôzne informácie na základe pevne daných ciest. No je tu ten problém, že nie všetky dokumenty majú rovnakú štruktúru.

Prikladám dva dokumenty:
http://www.uvo.gov.sk/sk/evestnik/-/vestnik/save/185488.xml
a
http://www.uvo.gov.sk/sk/evestnik/-/vestnik/save/185485.xml

V oboch dokumentoch sa nachádza aj tento kód:

      <Label Title="NUTS kód: " />
      <SelectList FormComponentId="nuts" Type="NUTS" Value="10">
        <SelectListValue Title="SK032" Id="10" />
      </SelectList>

z neho potrebujem vybrať "SK032". No lenže tu nastáva problém, že v prvom dokumente je iná cesta k tomuto úryvku a v druhom dokumente je iná.

Už si fakt neviem rady, pretože mi kvôli tomuto zlyháva aj foreach, keďže keď narazí na error, že objekt nevie nájsť, ďalej sa už nespustí.

Ďakujem veľmi pekne za pomoc.
Oison
Profil
Use SAX - dokumentace - http://php.net/manual/en/book.xml.php

<?php
/* Načteme data ze souboru */
$xml = file_get_contents("xml.xml");

/* Vytvoříme parser */
$parser = xml_parser_create();

/* Přidáme handler, když to najde nějaký element (začátek a konec)
 * Jak to najde, tak se nám volá funkce:
 *     - začátek elementu -> startElement
 *  - konec elementu -> endElement
 */
xml_set_element_handler($parser, "startElement", "endElement");

/* Spustíme parser */
xml_parse($parser, $xml);


/* 
 * Funkce, která je zavolána při najití začátku elementu
 * @parm $parser nas parser
 * @parm $name string jmeno elementu
 * @parm $attrs array pole atributu elementu
 * Ověříme, že nalezený element je SELECTLISTVALUE a ověříme jestli má atribut TITLE
 * Pokud ano, tak tento atribut vypiseme
 */
function startElement($parser, $name, $attrs){
        if($name == "SELECTLISTVALUE")
            if(isset($attrs['TITLE'])){
                echo $attrs['TITLE'];
            }
}

/* 
 * To stejné, ale konce elementu
 * Teď nepodstatné!
 */ 
function endElement($parser, $name){}
Tori
Profil
Přes XPath se dá vyhledat libovolně zanořený prvek. Tohle hledá strukturu <SelectList FormComponentId="nuts"><SelectListValue Title="(cokoliv)"/></SelectList>

$files = array('oznamenie_185488.xml', 'oznamenie_185485.xml');
foreach($files as $file) {
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = false;
    $doc->validateOnParse = false;
    $doc->Load($file);
    $xpath = new DOMXPath($doc);
    // nastavení výchozího NS je nutné, bez něj nefunguje
    $rootNamespace = $doc->lookupNamespaceUri($doc->namespaceURI); 
    $xpath->registerNamespace('x', $rootNamespace); 
    $title = $xpath->query('//x:SelectList[@FormComponentId="nuts"]/x:SelectListValue[1]/@Title')->item(0)->nodeValue;
    echo "\n Nalezena hodnota: $title";
}
bagocina
Profil
Ďakujem Vám veľmi pekne za pomoc!

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: