Skocz do zawartości

Jak sparsować ten plik XML?


Arent

Rekomendowane odpowiedzi

Jak sparsować ten plik XML, żeby wyodrębnić nie całą linię tylko konkretna wartość, np. 3_PRICE

 

 

<?xml version="1.0" ?>

- <DOCUMENT STATUS="OK">

- <DATA>

<ITEM name="XXXX" 1_PRICE=70" ID="1" DATE="17-09-2008 11:28:00" NUMBER="300" 2_PRICE="420" 3_PRICE="13" 4_PRICE="421" 5_PRICE="206" STATUS="dfdfd" />

</DATA>

</DOCUMENT>

 

 

z takim kodem próbowałem ale to zczytuje inną srukturę i w tym przypadku nie działa

 

<?php

$a = "0";

$connect = fopen("http://fgfffh...", "r") or die("Błąd przy

łączeniu");

while (!feof($connect))

{

$a++;

$buffer = fgets($connect, 4096) or die("Błąd przy odczycie");

 

if($a == "166")

{

$link = $buffer;

}

};

fclose($connect);

 

$link1 = strstr($link, 'xml');

$link2 = substr($link1, '0', '4');

$link = "http://fgfffh...".$link2;

 

$a = "0";

$connect = fopen($link, "r") or die("Błąd przy łączeniu");

while (!feof($connect))

{

$a++;

$buffer = fgets($connect, 4096) or die("Błąd przy odczycie");

 

if($a == "25") {$value = $buffer;}

}

fclose($connect) or die("Błąd przy zamykaniu połączenia");

echo "$value<br>";

?>

Odnośnik do komentarza
Udostępnij na innych stronach

Masz klasy:

<?php
     class XML {
          private $level, $levels;
          function __construct( $file ) {
               if( !file_exists( $file ) ) {
                    return;
               }
               
               if( ( $fh = @fopen( $file, 'r' ) ) === false ) {
                    return;
               }

               $xml = xml_parser_create();
               xml_parser_set_option( $xml, XML_OPTION_CASE_FOLDING, 1 );
               xml_parser_set_option( $xml, XML_OPTION_SKIP_WHITE, 1 );
               xml_set_element_handler( $xml, array( $this, 'elementStart' ), array( $this, 'elementEnd' ) );
               xml_set_character_data_handler( $xml, array( $this, 'elementContent' ) );

               $this->level = 0;
               $this->levels = array( $this );
               
               while( ( $data = fread( $fh, 512 ) ) != false ) {
                    if( !xml_parse( $xml, $data, feof( $fh ) ) ) {
                         return;
                    }
               }
               
               unset( $this->level );
               unset( $this->levels );
               
               xml_parser_free( $xml );

               fclose( $fh );
          }
          
          function elementStart( $xml, $name, $attrs ) {
               $element = new XMLElement( $name, $attrs );

               $this->levels[$this->level]->childs[] = $element;
               $this->level++;
               $this->levels[$this->level] = $element;
          }
          
          function elementEnd( $xml, $name ) {
               $this->levels[$this->level]->content = trim( $this->levels[$this->level]->content );
               $this->level--;
          }
          
          function elementContent( $xml, $content ) {
               $this->levels[$this->level]->content .= $content;
          }
     }
     
     class XMLElement {
          function __construct( $name, $attrs ) {
               $this->name = $name;

               $this->content = '';
               $this->childs = array();
               $this->attrs = array();
               foreach( $attrs as $key => $value ) {
                    $this->attrs[$key] = $value;
               }
          }
     }
?>

Może coś Ci to pomoże.

Odnośnik do komentarza
Udostępnij na innych stronach

<?php
    $constents = file_get_contents( 'file.txt' ); //Wczytanie zawartości do bufora
    
    $items = array();
    if( preg_match_all( '/<item(.+?) \/>/i', $constents, $matchItems ) ) {
        for( $i = 0; $i < count( $matchItems[0] ); $i++ ) {
            if( preg_match_all( '/([a-z0-9_]+?)="(.+?)"/i', $matchItems[1][$i], $matchItem ) ) {
                $item = array();
                for( $a = 0; $a < count( $matchItem[0] ); $a++ ) {
                    $item[strtolower( $matchItem[1][$a] )] = $matchItem[2][$a];
                }
                if( isset( $item['id'] ) ) {
                    $items[$item['id']] = $item;
                }
            }
        }
    }
?>

Masz wszystko w tablicy items sortowane wg ID.

Enjoy.

Odnośnik do komentarza
Udostępnij na innych stronach

Kod działa, bo sprawdzałem na tym co Ty tu dałeś:

<?xml version="1.0" ?>
<DOCUMENT STATUS="OK">
<DATA>
<ITEM name="XXXX" 1_PRICE=70" ID="1" DATE="17-09-2008 11:28:00" NUMBER="300" 2_PRICE="420" 3_PRICE="13" 4_PRICE="421" 5_PRICE="206" STATUS="dfdfd" />
</DATA>
</DOCUMENT>

dostęp do przedmiotu jest przez:

$items[ID_PRZEDMIOTU]

a jeśli już chcesz 4_PRICE to:

$items[ID_PRZEDMIOTU]['4_price']

w tym przypadku to:

$items[1]['4_price']

kapisz?

Odnośnik do komentarza
Udostępnij na innych stronach

Gdybym wiedział o co Ci dokładnie chodzi to bym Ci dokładnie powiedział jak to trzeba zrobić, ale że podajesz takie szczątkowe informacje to tutaj równie szczątkowa odpowiedź: doklej sobie ten mój kod do Twojego - oczywiście na końcu i podmień w swoim zmienną $value na $constents.

Odnośnik do komentarza
Udostępnij na innych stronach

To ma tak wyglądać? Sprawdziłem ale nie działa

 

 

Jak już mówiłem chodzi mi o najprostrze wyciągnięcie liczby która jest w 4_price a następnie zapisanie jej w bazie mysql, to drugie to pryszcz, ale widzę że to pierwsze to problem

 

 

<?php

$a = "0";

$connect = fopen("http://..........xml.bat", "r") or die("Błąd przy

łączeniu");

while (!feof($connect))

{

$a++;

$buffer = fgets($connect, 4096) or die("Błąd przy odczycie");

 

if($a == "166")

{

$link = $buffer;

}

};

fclose($connect);

 

$link1 = strstr($link, 'xml');

$link2 = substr($link1, '0', '4');

$link = "http://..........xml.bat".$link2;

 

$a = "0";

$connect = fopen($link, "r") or die("Błąd przy łączeniu");

while (!feof($connect))

{

$a++;

$buffer = fgets($connect, 4096) or die("Błąd przy odczycie");

 

if($a == "25") {$constents = $buffer;}

}

fclose($connect) or die("Błąd przy zamykaniu połączenia");

echo "$constents<br>";

 

 

 

$constents = file_get_contents( 'http://.....xml.bat' ); //Wczytanie zawartości do bufora

 

$items = array();

if( preg_match_all( '/<item(.+?) \/>/i', $constents, $matchItems ) ) {

for( $i = 0; $i < count( $matchItems[0] ); $i++ ) {

if( preg_match_all( '/([a-z0-9_]+?)="(.+?)"/i', $matchItems[1][$i], $matchItem ) ) {

$item = array();

for( $a = 0; $a < count( $matchItem[0] ); $a++ ) {

$item[strtolower( $matchItem[1][$a] )] = $matchItem[2][$a];

}

if( isset( $item[1] ) ) {

$items[$item[1]['4_price'] = $item;

}

}

}

}

?>

 

 

np. taki kod XML mam i chciałbym określając ID np. 4 oraz 4_PRICE wydobyć liczbę 346

 

<?xml version="1.0" ?>

- <DOCUMENT STATUS="OK">

- <DATA>

<ITEM name="XXXX" 1_PRICE=70" ID="1" DATE="17-09-2008 11:28:00" NUMBER="300" 2_PRICE="420" 3_PRICE="13" 4_PRICE="421" 5_PRICE="206" STATUS="dfdfd" />

<ITEM name="XXXX" 1_PRICE=70" ID="2" DATE="17-09-2008 11:28:00" NUMBER="300" 2_PRICE="420" 3_PRICE="13" 4_PRICE="46" 5_PRICE="206" STATUS="dfdfd" />

<ITEM name="XXXX" 1_PRICE=70" ID="3" DATE="17-09-2008 11:28:00" NUMBER="300" 2_PRICE="420" 3_PRICE="13" 4_PRICE="21" 5_PRICE="206" STATUS="dfdfd" />

<ITEM name="XXXX" 1_PRICE=70" ID="4" DATE="17-09-2008 11:28:00" NUMBER="300" 2_PRICE="420" 3_PRICE="13" 4_PRICE="346" 5_PRICE="206" STATUS="dfdfd" />

</DATA>

</DOCUMENT>

Odnośnik do komentarza
Udostępnij na innych stronach

Znasz tak się tak trochę na PHP czy raczej nie? :)

<?php
    $connect = fopen( 'http://fgfffh...', 'r' )
        or die( 'Błąd przy łączeniu' );

    $a = 0;
    while( !feof( $connect ) ) {
        $a++;
        $buffer = fgets( $connect, 4096 )
            or die( 'Błąd przy odczycie' );

        if( $a == 166 ) {
            $link = $buffer;
        }
    }

    fclose( $connect )
        or die( 'Błąd przy zamykaniu połączenia' );

    $link1 = strstr( $link, 'xml' );
    $link2 = substr( $link1, '0', '4' );
    $link = 'http://fgfffh...' . $link2;

    $connect = fopen( $link, 'r' )
        or die( 'Błąd przy łączeniu' );

    $a = 0;
    while( !feof( $connect ) ) {
        $a++;
        $buffer = fgets( $connect, 4096 )
            or die( 'Błąd przy odczycie' );

        if( $a == 25 ) {
            $constents = $buffer;
        }
    }

    fclose( $connect )
        or die( 'Błąd przy zamykaniu połączenia' );

    $items = array();
    if( preg_match_all( '/<item(.+?) \/>/i', $constents, $matchItems ) ) {
        for( $i = 0; $i < count( $matchItems[0] ); $i++ ) {
            if( preg_match_all( '/([a-z0-9_]+?)="(.+?)"/i', $matchItems[1][$i], $matchItem ) ) {
                $item = array();
                for( $a = 0; $a < count( $matchItem[0] ); $a++ ) {
                    $item[strtolower( $matchItem[1][$a] )] = $matchItem[2][$a];
                }
                if( isset( $item['id'] ) ) {
                    $items[$item['id']] = $item;
                }
            }
        }
    }
    
    echo $items[1]['4_price'];
?>

 

Jak już jeszcze dopisałeś, to mój kod dla tego XMLa generuje taką tablicę:

ID 1:
            name      => XXXX
              id      => 1
            date      => 17-09-2008 11:28:00
          number      => 300
         2_price      => 420
         3_price      => 13
         4_price      => 421
         5_price      => 206
          status      => dfdfd
ID 2:
            name      => XXXX
              id      => 2
            date      => 17-09-2008 11:28:00
          number      => 300
         2_price      => 420
         3_price      => 13
         4_price      => 46
         5_price      => 206
          status      => dfdfd
ID 3:
            name      => XXXX
              id      => 3
            date      => 17-09-2008 11:28:00
          number      => 300
         2_price      => 420
         3_price      => 13
         4_price      => 21
         5_price      => 206
          status      => dfdfd
ID 4:
            name      => XXXX
              id      => 4
            date      => 17-09-2008 11:28:00
          number      => 300
         2_price      => 420
         3_price      => 13
         4_price      => 346
         5_price      => 206
          status      => dfdfd

Odnośnik do komentarza
Udostępnij na innych stronach

hehe, dawno nie siedziałem w php i pozapominałem :)

 

co do kodu do zrobiłem identycznie jak napisałeś i nie wywala błędu ale mam czystą stronę, w żródle strony też nie ma wartości którą chcę wydobyć

 

mam tylko

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML><HEAD>

<META http-equiv=Content-Type content="text/html; charset=windows-1250"></HEAD>

<BODY></BODY></HTML>

Odnośnik do komentarza
Udostępnij na innych stronach

A zrób zamiast

echo $items[1]['4_price'];

echo var_dump( $items );

I zacytuj co zwróci.

 

Bo gdybym wiedział co dokładnie chcesz uzyskać i skąd to bym zrobił całość.

Już pomijając to 4_PRICE z jakiegoś tam ID bo tyle wiem. =P

Odnośnik do komentarza
Udostępnij na innych stronach

no ale przecież sprawdzałem na tym pliku to:

 

<?xml version="1.0" ?>

- <DOCUMENT STATUS="OK">

- <DATA>

<ITEM name="XXXX" 1_PRICE=70" ID="1" DATE="17-09-2008 11:28:00" NUMBER="300" 2_PRICE="420" 3_PRICE="13" 4_PRICE="421" 5_PRICE="206" STATUS="dfdfd" />

<ITEM name="XXXX" 1_PRICE=70" ID="2" DATE="17-09-2008 11:28:00" NUMBER="300" 2_PRICE="420" 3_PRICE="13" 4_PRICE="46" 5_PRICE="206" STATUS="dfdfd" />

<ITEM name="XXXX" 1_PRICE=70" ID="3" DATE="17-09-2008 11:28:00" NUMBER="300" 2_PRICE="420" 3_PRICE="13" 4_PRICE="21" 5_PRICE="206" STATUS="dfdfd" />

<ITEM name="XXXX" 1_PRICE=70" ID="4" DATE="17-09-2008 11:28:00" NUMBER="300" 2_PRICE="420" 3_PRICE="13" 4_PRICE="346" 5_PRICE="206" STATUS="dfdfd" />

</DATA>

</DOCUMENT>

Odnośnik do komentarza
Udostępnij na innych stronach

wszystko posprawdzałem i jest ok

 

co tu może być źle skoro otwieram plik xml bezpośrednio w przeglądarce i wszystko jest ok

 

podsumowując:

 

przykładowy kod bezpośrednio z źródła strony xml

 

 

<?xml version="1.0"?>

<DOCUMENT STATUS="OK">

<DATA>

<ITEM name="NAME" A="4219" ID="1" DATE="17-09-2008 11:28:00" X="300" B="4202" C="4213" D="1421" E="4206" STATUS="F" />

</DATA>

</DOCUMENT>

 

 

i plik php

 

 

<?php

$connect = fopen( 'http://www.plik.xml', 'r' )

or die( 'Błąd przy łączeniu' );

 

$a = 0;

while( !feof( $connect ) ) {

$a++;

$buffer = fgets( $connect, 4096 )

or die( 'Błąd przy odczycie' );

 

if( $a == 166 ) {

$link = $buffer;

}

}

 

fclose( $connect )

or die( 'Błąd przy zamykaniu połączenia' );

 

$link1 = strstr( $link, 'xml' );

$link2 = substr( $link1, '0', '4' );

$link = 'http://www.plik.xml' . $link2;

 

$connect = fopen( $link, 'r' )

or die( 'Błąd przy łączeniu' );

 

$a = 0;

while( !feof( $connect ) ) {

$a++;

$buffer = fgets( $connect, 4096 )

or die( 'Błąd przy odczycie' );

 

if( $a == 25 ) {

$constents = $buffer;

}

}

 

fclose( $connect )

or die( 'Błąd przy zamykaniu połączenia' );

 

$items = array();

if( preg_match_all( '/<item(.+?) \/>/i', $constents, $matchItems ) ) {

for( $i = 0; $i < count( $matchItems[0] ); $i++ ) {

if( preg_match_all( '/([a-z0-9_]+?)="(.+?)"/i', $matchItems[1][$i], $matchItem ) ) {

$item = array();

for( $a = 0; $a < count( $matchItem[0] ); $a++ ) {

$item[strtolower( $matchItem[1][$a] )] = $matchItem[2][$a];

}

if( isset( $item['id'] ) ) {

$items[$item['id']] = $item;

}

}

}

}

 

echo var_dump( $items );

?>

Odnośnik do komentarza
Udostępnij na innych stronach

dowiedziałem się że wystarczy zmienić rozszerzenie na .php5

 

spróbowałem z innym kodem, dużo krótszym ^_^

 

<?

$xml = simplexml_load_file('plik.xml');

$ksiazki = $xml->xpath('/*/*');

 

foreach ($ksiazki as $item) {

$ID = iconv($item['ID']);

$E = iconv($item['E']);

$DATE = iconv($item['DATE']);

 

echo "

Autor: $ID<br />

Tytuł: $E<br />

Cena: $DATE<br />

";

}

?>

 

 

xml:

 

 

 

<?xml version="1.0"?>

<DOCUMENT STATUS="OK">

<DATA>

<ITEM name="NAME" A="4219" ID="1" DATE="17-09-2008 11:28:00" X="300" B="4202" C="4213" D="1421" E="4206" STATUS="F" />

<ITEM name="NAME" A="219" ID="2" DATE="17-09-2008 11:28:00" X="30" B="402" C="423" D="121" E="406" STATUS="F" />

</DATA>

</DOCUMENT>

 

 

i mam

 

 

Warning: iconv() expects exactly 3 parameters, 1 given in /xml/alg.php5 on line 6

 

Warning: iconv() expects exactly 3 parameters, 1 given in /xml/alg.php5 on line 7

 

Warning: iconv() expects exactly 3 parameters, 1 given in /xml/alg.php5 on line 8

Autor:

Tytuł:

Cena:

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 miesiące temu...

Witajcie

 

Zacząłem się nudzić i znowu odgrzebałem ten banalny kod który nie chce działać

 

 

<?

$xml = simplexml_load_file('plik.xml');

$ksiazki = $xml->xpath('/*/*');

 

foreach ($plik as $item) {

$ID = iconv("ISO-8859-1","UTF-8", $item['X']);

$E = iconv("ISO-8859-1","UTF-8", $item['E']);

$DATE = iconv("ISO-8859-1","UTF-8", $item['DATE']);

 

echo "

1: $X<br />

2: $E<br />

3: $DATE<br />

";

}

?>

 

Jak napisałem, pojawia się tylko:

 

1: <br />

2: <br />

3: <br />

 

To wina hostingu? Bo kod wygląda na dobry

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...