Avatar billede mads1987 Nybegynder
20. december 2006 - 07:24 Der er 12 kommentarer

Læs XML fil

Hej eksperter. Jeg har en XML fil der ser således ud:

<my-result>
<parameters>
  <param-type>company</param-type>
  <param-id />
  <param-name>name</param-name>
</parameters>
</my-result>

Jeg ønsker at få 2 variabler ud af det. $type og $name, de skal selvfølgelig indeholde "company" og "name" i dette tilfælde.
Hvorledes løber jeg xml filen igennem?
Avatar billede djicep Nybegynder
20. december 2006 - 12:28 #1
http://dk2.php.net/manual/da/ref.xml.php Ved ikke om den kan bruges. men inde på php.net kan du nok finde nået om det ?
Avatar billede mads1987 Nybegynder
20. december 2006 - 16:26 #2
Jeg håbede på et eksempel på hvorledes jeg får data ud af XML fil jeg har skrevet som eksempel.
Avatar billede olebole Juniormester
20. december 2006 - 16:28 #3
<ole>

Der er bunker af eksempler bag det link, djicep skrev  =)

/mvh
</bole>
Avatar billede mads1987 Nybegynder
21. december 2006 - 10:59 #4
Jeg har fundet dette, som ser ud til at virke godt for mig.

<?php
    function xml_get_tree($xml) {
        $parser = xml_parser_create();
        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
        xml_parse_into_struct($parser, $xml, $vals, $index);
        xml_parser_free($parser);
   
        return array('tag' => $vals[0]['tag'], 'attributes' => isset($vals[0]['attributes']) ? $vals[0]['attributes'] : null, 'children' => xml_get_children($vals, $i = 0));
    }

    function xml_get_children($vals, &$i) {
        $children = array();
       
        if (isset($vals[$i]['value'])) $children[] = $vals[$i]['value'];
       
        $valssize = count($vals);
        while (++$i < $valssize) {
            switch ($vals[$i]['type']) {
                case 'cdata':
                    $children[] = $vals[$i]['value'];
                    break;
       
                case 'complete':
                    $children[] = array('tag' => $vals[$i]['tag'], 'attributes' => isset($vals[$i]['attributes']) ?    $vals[$i]['attributes'] : null,    'value' => isset($vals[$i]['value']) ? $vals[$i]['value'] : null);
                    break;

                case 'open':
                    $children[] = array('tag' => $vals[$i]['tag'], 'attributes' => isset($vals[$i]['attributes']) ? $vals[$i]['attributes'] : null,    'children'  => xml_get_children($vals, $i));
                    break;

                case 'close':
                    return $children;
            }
        }
    }

    function xml_condense_tree($tree) {
        foreach ($tree['children'] as $index => $node) {
            if (isset($node['children'])) {
                $tree['children'][$index] = xml_condense_tree($node);
            } elseif (isset($node['value']) and !$node['attributes']) {
                $tree['values'][$node['tag']] = $node['value'];
                unset($tree['children'][$index]);
            }
        }
   
        if (!$tree['children']) unset($tree['children']);
        return $tree;
    }

    $xml = '<?xml version="1.0" ?>'."\n";
    $xml .= '<hello>'."\n";
    $xml .= '    <what>world</what>'."\n";
    $xml .= '    <ehh>Hmm</ehh>'."\n";
    $xml .= '</hello>'."\n";

    $xmltree = xml_get_tree($xml); 
    $xmltree = xml_condense_tree($xmltree);
   
#    echo "<pre>";
#    var_dump($xmltree);
#    echo "</pre>";

    echo $xmltree["values"]["what"];
?>

Jeg kan dog ikke gennemskue hvorledes jeg indhenter en ekstern xml fil i stedet for den måde hvorpå det er kodet ind i scriptet i det tilfælde?
Avatar billede djicep Nybegynder
21. december 2006 - 12:31 #5
Hvad med det her lille stykke i toppen står der nået om hvordan du henter en ekstern xml fil

<?php
$file = "data.xml";
$depth = array();

function startElement($parser, $name, $attrs)
{
  global $depth;
  for ($i = 0; $i < $depth[$parser]; $i++) {
      echo "  ";
  }
  echo "$name\n";
  $depth[$parser]++;
}

function endElement($parser, $name)
{
  global $depth;
  $depth[$parser]--;
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
  die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
  if (!xml_parse($xml_parser, $data, feof($fp))) {
      die(sprintf("XML error: %s at line %d",
                  xml_error_string(xml_get_error_code($xml_parser)),
                  xml_get_current_line_number($xml_parser)));
  }
}
xml_parser_free($xml_parser);
?>
Avatar billede djicep Nybegynder
21. december 2006 - 12:32 #6
tænker på $file = "data.xml";
Avatar billede mads1987 Nybegynder
21. december 2006 - 13:55 #7
Det får jeg da ikke noget ud af?

tænker på $file = "data.xml"; ?
Jeg kan jo ikke skrive det i stedet for:
$xml = '<?xml version="1.0" ?>'."\n";
    $xml .= '<hello>'."\n";
    $xml .= '    <what>world</what>'."\n";
    $xml .= '    <ehh>Hmm</ehh>'."\n";
    $xml .= '</hello>'."\n";

Jeg er ved at blive sindsyg på det, har sidder med det 5 timer, og kan ikke få noget til at virke overhoved.
Avatar billede mads1987 Nybegynder
22. december 2006 - 15:57 #8
Er der slet ikke noget at gøre?
Avatar billede djicep Nybegynder
22. december 2006 - 16:00 #9
Tror bare du skal ind på det link jeg sendte dig og kigge deres eksempler igennem :)
Avatar billede mads1987 Nybegynder
22. december 2006 - 16:07 #10
Som jeg siger kan jeg ikke få det til at virke. Får bare en blank side? Det ville være en hjælp at få et hurtigt eksempel?
Avatar billede mads1987 Nybegynder
03. juli 2007 - 15:03 #11
djicep svar gerne
Avatar billede djicep Nybegynder
03. juli 2007 - 16:06 #12
Oki svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester