Okna.  Wirusy.  Notatniki.  Internet.  biuro.  Narzędzia.  Kierowcy

Mam do czynienia z osobą trzecią Biblioteka PHP, którego nie mogę edytować i działa dobrze przez prawie rok. Używa simplexml_load_string do odpowiedzi ze zdalnego serwera. Ostatnio dławił się dużymi odpowiedziami. To jest źródło danych dla obiektów nieruchomości, a jego format wygląda mniej więcej tak:

sysid 1 2 3 4 5 6 252370080 Mieszkalne 0,160 Nie ADDR0 06051 252370081 Mieszkaniowe 0,440 Tak ADDR0 06043 252370082 Mieszkaniowe 1.010 Nie ADDR0 06023 Więcej tekstu rozdzielanego tabulatorami

Pobrałem przykładowy plik odpowiedzi (około 22 MB) i tam skończyłem z debugowaniem i zdrowym rozsądkiem. Na obu serwerach działa PHP w wersji 5.3.8, ale zwróć uwagę na różne wyniki. Jestem prawie pewien, że oba pliki są takie same (zakładam, że różne rodzaje pliki, strlen i ostatnie 50 znaków można wyjaśnić za pomocą new Linie okien, które mają dodatkowy znak powrotu karetki). Scenariusz testowy:

raportowanie_błędów(-1); ini_set("błędy_wyświetlania", 1); $plik = "przykład-błędu.xml"; $xml = plik_get_contents($plik); echo "rozmiar pliku: "; var_dump(rozmiar pliku($plik)); echo "strlen: "; var_dump(strlen($xml)); echo "obiekt simplexml?"; var_dump(is_object(simplexml_load_string($xml))); echo "Ostatnie 50 znaków: "; var_dump(substr($xml, -50));

Dane wyjściowe lokalnie w systemie Windows:

Rozmiar pliku: int(21893604) strlen: int(21893604) obiekt simplexml? bool(true) Ostatnie 50 znaków: string(50) "RD DR CT Watertown 203-555-5555 "

Dane wyjściowe na zdalnym serwerze UNIX:

Rozmiar pliku: int(21884093) strlen: int(21884093) obiekt simplexml? Ostrzeżenie: simplexml_load_string(): Jednostka: linia 9511: błąd parsera: błąd wewnętrzny w /path/to/test.php w linii 19. Ostrzeżenie: simplexml_load_string(): SUFIT PODWIESZONY W FOLEJU, CEGŁA FP W FR, NOWA PODŁOGA W LR DR FR KUCHNIA przedpokoju w /path/to/test.php na linii 19 Ostrzeżenie: simplexml_load_string(): ^in /path/to/test.php na linii 19 Ostrzeżenie: simplexml_load_string(): Jednostka: linia 9511: błąd parsera: Dodatkowa zawartość w koniec dokumentu w /path/to/test.php w linii 19 Ostrzeżenie: simplexml_load_string(): PODWYŻONY SUFIT W FOLKU, CEGŁA FP W FR, NOWA PODŁOGA W KUCHNI LR DR FR FOYER w /path/to/test.php w linii 19 Ostrzeżenie: simplexml_load_string(): ^in /path/to/test.php w linii 19 bool(false) Ostatnie 50 znaków: string(50) "ORD DR CT Watertown 203-555-5555 "

Niektóre odpowiedzi na komentarze i dodatkowe informacje:

    Sam XML wydaje się być prawidłowy, o ile wiem (i to robi pracować w moim systemie).

    magic_quotes_runtime jest zdecydowanie wyłączony.

    Działający serwer ma wersję libxml 2.7.7, a drugi 2.7.6. Czy to naprawdę może coś zmienić? Nie mogłem znaleźć dziennika zmian libxml, ale wydaje się to mało prawdopodobne.

    Dzieje się tak tylko wtedy, gdy odpowiedź/plik przekracza określony rozmiar, a błąd zawsze pojawia się w następnym wierszu.

    Nie mam problemów z pamięcią, skrypt testowy działa natychmiast.

Istnieją różnice w konfiguracjach PHP, które mogę opublikować, gdybym wiedział, które z nich są istotne. Masz pomysł, co może być problemem lub wiesz o czymś jeszcze, co mogę sprawdzić?

Analizowanie XML zasadniczo oznacza przeglądanie dokumentu XML i zwracanie odpowiednich danych. I chociaż wszystko więcej Usługi internetowe zwracają dane w formacie JSON, ale większość nadal korzysta z formatu XML, dlatego ważne jest opanowanie analizowania XML, jeśli chcesz korzystać z pełnego zakresu dostępnych interfejsów API.

Korzystanie z rozszerzenia ProstyXML w PHP, który został dodany ponownie w PHP 5.0, praca z XML jest bardzo łatwa i prosta. W tym artykule pokażę Ci, jak to zrobić.

Podstawy użytkowania

Zacznijmy od następującego przykładu języki.xml:


>

> 1972>
> Dennisa Ritchiego >
>

> 1995>
> Rasmusa Lerdorfa >
>

> 1995>
> Jamesa Goslinga >
>
>

Ten dokument XML zawiera listę języków programowania z pewnymi informacjami o każdym języku: rokiem jego wdrożenia i nazwiskiem twórcy.

Pierwszym krokiem jest załadowanie pliku XML za pomocą funkcji simplexml_load_file(), Lub simplexml_load_string(). Jak sama nazwa funkcji wskazuje, pierwsza załaduje XML z pliku, a druga załaduje XML z ciągu znaków.

Obie funkcje wczytują całe drzewo DOM do pamięci i zwracają obiekt Element SimpleXMLE. W powyższym przykładzie obiekt zapisany jest w zmiennej $languages. Możesz używać funkcji var_dump() Lub drukuj_r() aby uzyskać szczegółowe informacje na temat zwracanego przedmiotu, jeśli chcesz.

Obiekt SimpleXMLElement
[lang] => Tablica
[ 0 ] => Obiekt SimpleXMLElement
[@attributes] => Tablica
[imię] => C
[pojawiło się] => 1972
[ twórca] => Dennis Ritchie
[ 1 ] => Obiekt SimpleXMLElement
[@attributes] => Tablica
[nazwa] => PHP
[pojawiło się] => 1995
[ twórca] => Rasmus Lerdorf
[ 2 ] => Obiekt SimpleXMLElement
[@attributes] => Tablica
[nazwa] => Java
[pojawiło się] => 1995
[ twórca] => James Gosling
)
)

Ten kod XML zawiera element główny Języki, który zawiera trzy elementy język. Każdy element tablicy odpowiada elementowi język w dokumencie XML.

Dostęp do właściwości obiektu można uzyskać za pomocą operatora -> . Na przykład $languages->lang zwróci obiekt SimpleXMLElement pasujący do pierwszego elementu język. Obiekt ten zawiera dwie właściwości: pojawił się i twórca.

$języki -> język [ 0 ] -> pojawił się ;
$języki -> język [ 0 ] -> twórca ;

Wyświetlanie listy języków i wyświetlanie ich właściwości jest bardzo proste dzięki standardowej pętli takiej jak dla każdego.

foreach ($języki -> język jako $lang ) (
printf (
"" ,
$lang["nazwa"] ,
$lang -> pojawił się,
$lang -> twórca
) ;
}

Zwróć uwagę, jak uzyskałem dostęp do nazwy atrybutu elementu lang, aby uzyskać nazwę języka. W ten sposób możesz uzyskać dostęp do dowolnego atrybutu elementu reprezentowanego jako obiekt SimpleXMLElement.

Praca z przestrzeniami nazw

Pracując z kodem XML różnych usług sieciowych, często natkniesz się na przestrzenie nazw elementów. Zmieńmy swoje języki.xml aby pokazać przykład użycia przestrzeni nazw:



xmlns:dc =>

> 1972>
> Dennisa Ritchiego >
>

> 1995>
> Rasmusa Lerdorfa >
>

> 1995>
> Jamesa Goslinga >
>
>

Teraz element twórca umieszczone w przestrzeni nazw DC, co wskazuje na http://purl.org/dc/elements/1.1/. Jeśli spróbujesz wydrukować kreatory języka przy użyciu naszego poprzedniego kodu, to nie zadziała. Aby odczytać przestrzenie nazw elementów, należy zastosować jedno z poniższych podejść.

Pierwsze podejście polega na użyciu nazw URI bezpośrednio w kodzie podczas odwoływania się do przestrzeni nazw elementu. Poniższy przykład pokazuje, jak to się robi:

$dc = $języki -> język [ 1 ] -> dzieci ( „http://purl.org/dc/elements/1.1/”) ;
echo $dc -> twórca;

metoda dzieci() pobiera przestrzeń nazw i zwraca elementy podrzędne rozpoczynające się od prefiksu. Pobiera dwa argumenty, pierwszy to przestrzeń nazw XML, a drugi to opcjonalny argument, którego wartością domyślną jest FAŁSZ. Jeśli drugi argument ma wartość TRUE, przestrzeń nazw będzie traktowana jako przedrostek. Jeśli FALSE, wówczas przestrzeń nazw będzie traktowana jako przestrzeń nazw URL.

Drugie podejście polega na odczytaniu nazw URI z dokumentu i użyciu ich w odniesieniu do przestrzeni nazw elementu. Jest to właściwie najlepszy sposób uzyskiwania dostępu do elementów, ponieważ nie trzeba być zakodowanym na stałe w identyfikatorze URI.

$namespaces = $languages ​​-> getNamespaces (true) ;
$dc = $języki -> język [ 1 ] -> dzieci ($przestrzenie nazw [ "dc" ] ) ;

echo $dc -> twórca;

metoda Pobierz przestrzenie nazw() zwraca tablicę nazw prefiksów i powiązanych z nimi identyfikatorów URI. Pobiera dodatkowy parametr, który domyślnie wynosi FAŁSZ. Jeśli zainstalujesz to tak PRAWDA, ta metoda zwróci nazwy używane w węzłach nadrzędnych i podrzędnych. W przeciwnym razie znajdzie przestrzenie nazw używane tylko w węźle nadrzędnym.

Teraz możesz przeglądać listę języków w następujący sposób:

$języki = simplexml_load_file („języki.xml” );
$ns = $języki -> getNamespaces (true) ;

foreach ($języki -> język jako $lang ) (
$dc = $lang -> dzieci ($ns [ "dc" ] ) ;
printf (
"

%s pojawił się w %d i został stworzony przez %s.

" ,
$lang["nazwa"] ,
$lang -> pojawił się,
$dc -> twórca
) ;
}

Studium przypadku — analizowanie kanału wideo YouTube

Spójrzmy na przykład, z którego odbierany jest kanał RSS Kanał Youtube i wyświetla linki do wszystkich filmów z niego. W tym celu prosimy o kontakt pod następującym adresem:

http://gdata.youtube.com/feeds/api/users/xxx/uploads

Adres URL zwraca listę najnowszych filmów z danego kanału w formacie XML. Przeanalizujemy plik XML i uzyskamy następujące informacje o każdym filmie:

  • Link do filmu
  • Miniaturowy
  • Nazwa

Zaczniemy od wyszukania i załadowania pliku XML:

$kanał = "Nazwa kanału" ;
$adres = „http://gdata.youtube.com/feeds/api/users/”. $kanał. "/przesłane" ;
$xml = plik_get_contents ($url) ;

$feed = simplexml_load_string ($xml) ;
$ns = $feed -> getNameSpaces (true) ;

Jeśli spojrzysz na kanał XML, zobaczysz, że jest tam kilka elementów. podmiot, z których każdy przechowuje szczegółowe informacje o konkretnym filmie z kanału. Używamy jednak tylko miniatur obrazów, adresu wideo i tytułu. Te trzy elementy są dziećmi elementu Grupa, który z kolei jest dzieckiem wejście:

>

>



Tytuł... >

>

>

Po prostu przejrzymy wszystkie elementy wejście i wyodrębnij niezbędne informacje dla każdego z nich. zauważ to gracz, Miniaturka I tytuł znajdują się w przestrzeni nazw mediów. Musimy zatem postępować jak w poprzednim przykładzie. Nazwy pobieramy z dokumentu i używamy przestrzeni nazw w odniesieniu do elementów.

foreach ($feed -> wpis jako $entry ) (
$group = $entry -> dzieci ($ns ["media"] ) ;
$grupa = $grupa -> grupa;
$thumbnail_attrs = $grupa -> miniatura [ 1 ] -> atrybuty () ;
$image = $thumbnail_attrs [ "url"] ;
$gracz = $grupa -> gracz -> atrybuty () ;
$link = $gracz["url"] ;
$tytuł = $grupa -> tytuł;
printf ( "

" ,
$gracz, $obraz, $tytuł) ;
}

Wniosek

Teraz, gdy wiesz, jak używać ProstyXML Aby analizować dane XML, możesz udoskonalić swoje umiejętności, analizując różne źródła danych XML za pomocą różnych interfejsów API. Należy jednak pamiętać, że SimpleXML wczytuje cały DOM do pamięci, więc jeśli analizujesz duży zbiór danych, może zabraknąć pamięci. Aby dowiedzieć się więcej o SimpleXML przeczytaj dokumentację.


Jeśli masz jakieś pytania, skorzystaj z naszego

Biblioteka znaczników do przetwarzania XML za pomocą za pomocą PHP

PHP w wersji 5 wprowadza SimpleXML, nowy interfejs programowania aplikacji (API) do odczytu i zapisu XML. Rozszerzenia SimpleXML, takie jak

$doc->rss->kanał->element->tytuł

wybierz elementy z dokumentu. Tak długo, jak masz dobre pojęcie o strukturze swojego dokumentu, pisanie tych wyrażeń jest łatwe. Jeśli jednak nie wiesz dokładnie, gdzie pojawiają się interesujące Cię elementy (jak ma to miejsce w przypadku Docbooka, HTML i podobnych dokumenty tekstowe), SimpleXML może używać wyrażeń XPath do znajdowania tych elementów.

Pierwsze kroki z SimpleXML

Wyobraź sobie, co chcesz stworzyć strona PHP, który konwertuje kanał RSS na kod HTML. RSS to główny format XML służący do publikowania treści z wielu źródeł. Elementem głównym tego dokumentu jest rss, który zawiera pojedynczy element kanału. Element kanału zawiera metadane dotyczące treści, w tym jej tytuł, język i adres URL. Zawiera także różnorodne elementy tekstowe zagnieżdżone w elementach pozycji. Każdy element elementu ma element link, który zawiera adres URL, tytuł lub opis (zwykle oba), które zawierają czytelny tekst. Przestrzenie nazw nie są używane. Oczywiście o RSS można powiedzieć znacznie więcej, ale na potrzeby tego artykułu te informacje wystarczą. pokazuje typowy przykład z kilkoma komunikatami informacyjnymi.

Listing 1. Kanał RSS
Mokka mit Schlag http://www.elharo.com/blog pl Penn Station: Przeminęło, ale nie zapomniano Stary Penn Station w Nowym Jorku został zburzony, zanim się urodziłem. Patrząc na te zdjęcia, wydaje mi się, że to pomyłka. Obecna witryna jest funkcjonalna, ale już nie; tak naprawdę tylko kilka wieżowców biurowych i podziemnych korytarzy, które nie są szczególnie interesujące i piękne. Nowy Madison Square... http://www.elharo.com/blog/new-york/2006/07/31/penn-station Osobiste dla Elliotte Harold Niektórzy ludzie używają bardzo nieprzyjemnych filtrów spamu, które wymagają wpisania losowego ciągu znaków w temacie, np. E37T, aby się przedostać. Nie trzeba dodawać, że ani ja, ani większość innych ludzi nie zawracamy sobie głowy komunikacją z tymi paranoikami. Rażąco przesadnie reagują na problem spamu. Osobiście nie będę... http://www.elharo.com/blog/tech/2006/07/28/personal-for-elliotte-harold/

Stwórzmy stronę PHP, która formatuje każdy kanał RSS jako HTML. pokazuje strukturę przyszłej strony.

Listing 2. Struktura statyczna kodu PHP
<?php // Заголовок будет читаться из RSS ?>



Parsowanie dokumentu XML

Pierwszym krokiem jest przeanalizowanie dokumentu XML i zapisanie go w zmiennej. Wymaga to napisania tylko jednej linii kodu, która przekazuje adres URL do funkcji simplexml_load_file():

$rss = simplexml_load_file("http://partners.userland.com/nytRss/nytHomepage.xml");
Ostrzeżenie

Zastosowany tutaj schemat jest niebezpiecznie daleki od optymalnego. Naprawdę nie powinienem pobierać i analizować kanału RSS przy każdym wejściu na stronę. Spowalnia to działanie czytelników strony i stanowi potencjalną odmowę obsługi pobieranych przeze mnie kanałów RSS, ponieważ większość z nich ustawia maksymalną częstotliwość aktualizacji na około raz na godzinę. Prawdziwym rozwiązaniem tego problemu jest buforowanie lub tworzenie Strony HTML lub kanały RSS, lub jedno i drugie. Jednak ta kwestia jest sprzeczna przy użyciu SimpleXML bibliotek, więc trochę je tutaj upiększam.

W tym przykładzie wziąłem stronę z kanału Userland New York Times pod adresem http://partners.userland.com/nytRss/nytHomepage.xml. Oczywiście możesz zamiast tego użyć dowolnego innego adresu URL dla innego kanału RSS.

Zauważ, że pomimo nazwy simplexml_load_ plik() ta funkcja będzie musiała przeanalizować dokument XML pod zdalnym adresem URL HTTP. Ale to nie jedyna niespodzianka w tej funkcji. Wartość zwracana przez funkcję, która jest tutaj przechowywana w zmiennej $rss, nie wskazuje na cały dokument, jak można by się spodziewać na podstawie doświadczeń z innymi API, takimi jak np. Model obiektowy dokument (DOM). Wskazuje raczej na główny element dokumentu. Treść zawarta w prologu i epilogu dokumentu nie jest dostępna w SimpleXML.

Znajdowanie nazwy kanału

Nazwa całego kanału (w przeciwieństwie do tytułów poszczególnych fragmentów tekstowych tego kanału) znajduje się w tytułowym elemencie podrzędnym elementu kanału, który pochodzi od elementu głównego rss. Możesz załadować ten nagłówek tak, jakby dokument XML był po prostu serializowaną formą obiektu rss z polem kanał, co z kolei miałoby pole tytuł. Używając zwykłej składni odwołań do obiektów PHP, ta instrukcja znajduje nagłówek:

$tytuł = $rss->kanał->tytuł;

Po znalezieniu tytułu należy dodać go do wyniku HTML. To proste: powtórz zmienną $title:

<?php echo $title; ?>

Ta linia wyprowadza wartość ciągu elementu, ale nie cały element. Oznacza to, że tekst jest rejestrowany, ale tagi nie.

Możesz nawet całkowicie pominąć zmienną pośrednią $title:

<?php echo $rss->kanał->tytuł; ?>

Ponieważ ta strona ponownie wykorzystuje tę wartość w wielu miejscach, uważam, że wygodniej jest przechowywać ją jako zmienną o opisowym tytule.

Iterowanie po elementach

$rss->kanał->element

Jednak kanały zwykle zawierają więcej niż jeden element. A może w ogóle ich nie ma. Odpowiednio ta instrukcja zwraca tablicę, którą można iterować za pomocą pętli for-each:

foreach ($rss->kanał->element jako $item) ( echo "

". $przedmiot->tytuł. "

"; Echo "

". $przedmiot->opis. "

"; }
Listing 3. Proste, ale pełny program Czytnik RSS PHP
kanał->tytuł; ?> <?php echo $title; ?>

kanał->element jako $element) ( echo "

połączyć. "">".$przedmiot->tytuł. "

"; Echo "

". $przedmiot->opis. "

"; } ?>

To wszystko, czego potrzeba, aby napisać prosty program Czytniki RSS w PHP - Wiele Ciągi HTML i kilka Ciągi PHP. Nie licząc spacji, łącznie 20 linii. Oczywiście nie jest to najbardziej bogaty w funkcje, zoptymalizowany i niezawodny rozwój. Zobaczmy, co możemy zrobić, aby to naprawić.

Przetwarzanie błędów

Nie wszystkie kanały RSS są tak dobrze sformułowane, jak powinny. Specyfikacja XML wymaga od procesorów zaprzestania przetwarzania dokumentów w przypadku wykrycia błędu formalnego, a SimpleXML jest zgodny z programem przetwarzającym XML. Jednak w przypadku znalezienia błędu nie będzie to zbyt pomocne. Zwykle program zapisuje ostrzeżenie w pliku błędów php (ale nie zawiera szczegółowego komunikatu o błędzie), a funkcja simplexml-load-file() zgłasza błąd. Jeśli nie masz pewności, czy analizowany plik jest dobrze zbudowany, przed użyciem danych pliku sprawdź, czy nie występuje ten błąd, jak pokazano w .

Listing 4. Uważaj na zniekształcone dane wejściowe
xpath("//tytuł") jako $tytuł) ( echo "

„. $tytuł.”

"; ) ) else ( echo "Ups! Dane wejściowe są zniekształcone!"; ) ?>

Inny częsty błąd ma miejsce, gdy dokument jest dobrze sformatowany, ale nie zawiera oczekiwanych elementów tam, gdzie się ich spodziewasz. Co się dzieje np. z takim wyrażeniem $doc->rss->channel->item->title , gdy grupa elementów nie posiada tytułu (jak to ma miejsce w przypadku co najmniej jednego ze stu najczęściej występujących kanałów RSS)? Najprostszym podejściem jest zawsze traktowanie wartości zwracanej funkcji jako tablicy danych i zawijanie jej w pętlę. W takim przypadku jesteś chroniony przed faktem, że elementów jest więcej lub mniej, niż się spodziewałeś. Jeśli jednak wiesz, że chcesz mieć pierwszy element w dokumencie, nawet jeśli jest ich więcej niż jeden, możesz zapytać o niego za pomocą indeksu liczonego od zera. Na przykład, aby poprosić o tytuł pierwszej grupy elementów, możesz napisać:

$doc->rss->kanał->element->tytuł

Jeśli pierwsza grupa elementów jest nieobecna lub nie ma nazwy, jest traktowana w taki sam sposób, jak każda inna grupa znajdująca się poza nią ustalone ramy indeks, w Tablica PHP. Oznacza to, że wynikiem jest null, który przy próbie wklejenia go do wyjściowego kodu HTML zamienia się w pusty ciąg znaków.

Rozpoznawanie i odrzucanie nieoczekiwanych formatów, z którymi nie jesteś przygotowany do pracy, jest zwykle domeną walidatora. Parser XML. Jednak SimpleXML nie może sprawdzać poprawności szablonu DTD (DTD) ani schematu danych. Sprawdza jedynie poprawność formalną.

Jak pracować z przestrzenią nazw

Wiele witryn przechodzi obecnie z RSS na Atom. pokazuje przykładowy dokument w Atom. Ten dokument jest pod wieloma względami identyczny z przykładem RSS. Jest tu jednak więcej metadanych, a elementem głównym jest kanał, a nie rss. Element kanału zawiera listy zamiast elementów. Element treści zastępuje element opisu. Co ważniejsze, dokument Atom używa przestrzeni nazw, podczas gdy RSS nie. W ten sposób dokument Atom może generować rzeczywistą, nieobciętą treść Extensible HTML (XHTML).

Listing 5. Dokument w Atomie
2006-08-04T16:00:04-04:00 http://www.cafeconleche.org/ Cafe con Leche Wiadomości i zasoby XML Prawa autorskie 2006 Elliotte Rusty Harold Steve Palmer opublikował wersję beta programu Vienna 2.1, an <a href="https://sukachoff.ru/pl/ustrojjstva/naznachenie-diagramm-uml-instrumenty-dlya-risovaniya-uml-diagramm-open/">otwarte źródło</a> Klient RSS/Atom dla systemu Mac OS X.

Steve Palmer opublikował wersję beta Vienna 2.1, klienta RSS/Atom o otwartym kodzie źródłowym dla systemu Mac OS X. Vienna to pierwszy czytnik, który „uznałem za akceptowalny do codziennego użytku; nie jest świetny, ale wystarczająco dobry”. (Oczywiście moje standardy „dobrych wystarczające” są dość wysokie.) 2.1 skupia się na udoskonaleniu interfejsu użytkownika za pomocą ujednoliconego układu, który umożliwia przewijanie kilku artykułów, filtrowaniu artykułów (np. przeczytanie wszystkich artykułów od ostatniego odświeżenia), ręcznej zmianie kolejności folderów, nowym oknie pobierania informacji i ulepszony, skondensowany układ.

http://www.cafeconleche.org/#August_1_2006_25279 2006-08-01T07:01:19Z
Matt Mullenweg wydał Wordpress 2.0.4, silnik blogowy oparty na PHP i MySQL.

Matt Mullenweg wydał Wordpress 2.0.4, silnik blogowy oparty na PHP i MySQL. Wersja 2.0.4 łata różne luki w zabezpieczeniach, głównie dotyczące wtyczek.

http://www.cafeconleche.org/#August_1_2006_21750 2006-08-01T06:02:30Z

Choć nazwy elementów uległy zmianie, podstawowe podejście do pracy z SimpleXML w dokumentach w Atomie jest takie samo jak w przypadku RSS. Jedyna różnica polega na tym, że musisz określić przestrzeń nazw, tj. Uniform Resource Identifier (URI), gdy żądasz elementu z nazwą, tak jak nazwa lokalna. Jest to proces dwuetapowy: najpierw wykonaj zapytanie do elementów podrzędnych dana przestrzeń nazwy, przekazując przestrzeń nazw URI do funkcji Children(). Następnie zapytaj o elementy o poprawnej nazwie lokalnej w tej przestrzeni nazw. Wyobraź sobie, że najpierw załadowałeś kanał Atom do zmiennej $feed, w następujący sposób:

$feed = simplexml_load_file("http://www.cafeconleche.org/today.atom");

Te dwie linie znajdują teraz element tytułu:

$dzieci = $feed->dzieci("http://www.w3.org/2005/Atom"); $tytuł = $dzieci->tytuł;

Jeśli chcesz, możesz skondensować ten kod w jedną instrukcję, chociaż ciąg znaków będzie nieco długi. Wszystkie pozostałe elementy w przestrzeniach nazw powinny być obsługiwane w ten sam sposób. przedstawia pełna strona PHP wyświetlający nagłówki z nazwanego potoku Atom.

Listing 6. Prosty czytnik nagłówków PHP Atom
dzieci("http://www.w3.org/2005/Atom"); $tytuł = $dzieci->tytuł; ?> <?php echo $title; ?>

wejście; foreach ($wpisy jako $wpis) ( $details = $entry->children("http://www.w3.org/2005/Atom"); echo "

„. $szczegóły->tytuł.”

"; } ?>

Mieszana zawartość

Dlaczego w tym przykładzie pokazałem tylko nagłówki? Ponieważ w Atomie zawartość dowolnej listy może zawierać pełny tekst fragmentu, a nie tylko sam tekst, ale także cały znacznik. Ten - strukturę narracyjną: słowa z rzędu są przeznaczone do czytania przez ludzi. Podobnie jak w przypadku większości tego rodzaju danych, zawartość jest tutaj mieszana. XML nie jest już uproszczony, dlatego podejście SimpleXML zaczyna słabnąć. Nie może działać poprawnie w przypadku treści mieszanych, a pominięcie danych w wielu przypadkach uniemożliwia jego użycie.

Można zrobić jedno, ale jest to tylko częściowe rozwiązanie problemu. Będzie działać tylko dlatego, że element treści zawiera prawdziwy XHTML. Możesz skopiować ten XHTML jako nieprzeanalizowany źródło bezpośrednio do produktu końcowego za pomocą funkcji asXML(), na przykład w następujący sposób:

Echo "

". $details->content->asXML(). "

";

Wynik będzie mniej więcej taki.

Listing 7. Dane wyjściowe XML

Nikolai Grigoriev wydał SVGMath 0.3, formater prezentacji MathML, który tworzy SVG napisany w czystym Pythonie i opublikowany na licencji MIT. Według Grigoriewa: „Nowa wersja może współpracować z dokumentami o wielu przestrzeniach nazw (np. zastąpić wszystkie poddrzewa MathML przez SVG w dokumencie XSL-FO lub XHTML); konfiguracja jest bardziej elastyczna i poprawiono kilka błędów. Dostępny jest również arkusz stylów aby dostosować położenie pionowe wynikowego obrazu SVG w XSL-FO.”

To nie jest czysty XHTML. Element treści jest pobierany z atomu dokumentu i tak naprawdę lepiej go nie mieć. Co gorsza, trafia do niewłaściwej przestrzeni nazw, przez co nie można go rozpoznać. Na szczęście ten dodatkowy element w praktyce nie bardzo szkodzi, gdyż przeglądarki internetowe po prostu ignorują tagi, których nie rozpoznają. Gotowy dokument jest wadliwy, ale to nie ma większego znaczenia. Jeśli naprawdę Ci to przeszkadza, zniweluj to za pomocą operacji na ciągach znaków, takich jak ta:

$opis = $szczegóły->treść->asXML(); $tagi = tablica(" ", ""); $notagi = tablica("", ""); $opis = str_replace($tagi, $notagi, $opis);

Aby uczynić kod nieco solidniejszym, użyj wyrażenia regularnego, zamiast zakładać, że znacznik początkowy jest dokładnie taki, jak pokazano powyżej. Szczególnie możesz obliczyć wiele możliwych atrybutów:

// znacznik końcowy ma stały kształt, więc łatwo go zastąpić $description = str_replace("", "", $description); // usuń znacznik początkowy, łącznie z atrybutami i białymi znakami, jeśli to możliwe $description = ereg_replace(" ]*>", "", $opis);

Nawet przy tej modyfikacji Twój kod może wydawać komentarze, polecenia obliczeniowe i fragmenty CDATA. Tak czy inaczej, ucinasz to, choć obawiam się, że to już nie jest takie proste. Treść mieszana po prostu przekracza granice, w ramach których SimpleXML został zaprojektowany.

XPath

Wyrażenia takie jak $rss->channel->item->title są świetne tylko wtedy, gdy dokładnie wiesz, jakie elementy znajdują się w dokumencie i dokładnie gdzie się znajdują. Jednak nie zawsze o tym wiesz. Na przykład w XHTML elementy nagłówka (h1, h2, h3 itd.) mogą być dziećmi body, div, table i kilku innych elementów. Co więcej, div, table, cytat blokowy i inne elementy mogą być zagnieżdżane wielokrotnie. W wielu mniej specyficznych przypadkach użycia łatwiej jest użyć wyrażeń XPath, takich jak //h1 lub //h1 . SimpleXML ma ten zestaw funkcjonalność za pomocą funkcji xpath().

Listing 9. Używanie XPath z przestrzeniami nazw
$atom = simplexml_load_file("http://www.cafeconleche.org/today.atom"); $atom->registerXPathNamespace("atm", "http://www.w3.org/2005/Atom"); $titles = $atom->xpath("//atm:title"); foreach ($tytuły jako $tytuł) ( echo "

„. $tytuł.”

"; }

Ostatnie ostrzeżenie: XPath w PHP jest dość powolny. Po przełączeniu na to wyrażenie XPath ładowanie strony może zająć od chwili do kilku sekund, nawet na niezaładowanym serwerze lokalnym. Jeśli używasz tych sztuczek, musisz użyć pewnego rodzaju buforowania, aby działać inteligentnie. Dynamiczne generowanie każdej strony po prostu nie będzie działać.

Wniosek

SimpleXML jest użytecznym dodatkiem do zestawu narzędzi programistów PHP, o ile nie musisz pracować z mieszaną zawartością. Obejmuje duża liczba przypadków użycia. Działa to szczególnie dobrze w przypadku prostych danych w postaci rekordów. Dopóki dokument nie jest zbyt głęboki, zbyt skomplikowany i nie zawiera mieszanej treści, SimpleXML jest znacznie prostszy niż jego alternatywa DOM. Pomocne jest również wcześniejsze poznanie struktury dokumentu, chociaż użycie XPath może znacznie złagodzić ten wymóg. Brak walidacji i wsparcia dla treści mieszanych jest uciążliwością, a nie zawsze przeszkodą. Wiele proste formaty nie mają mieszanej treści, a w wielu przypadkach używane są tylko bardzo przewidywalne formaty danych. Jeśli to właśnie charakteryzuje Twoją pracę, możesz wypróbować SimpleXML. Przy odrobinie uwagi poświęconej błędom i dostrojeniu pamięci podręcznej w celu ograniczenia problemów z wydajnością do minimum, SimpleXML może stać się solidnym, odpornym na błędy narzędziem do przetwarzania XML w PHP.

SimpleXML jest dość prostym, a jednocześnie dość wydajnym sposobem przetwarzania danych XML. Istotą simpleXML jest to, że cały kod XML jest konwertowany na obiekt PHP, co znacznie ułatwia pracę z nim. Podczas pracy z simpleXML wszystkie dane muszą być w kodowaniu UTF-8.

Najczęściej konwersja na obiekt PHP odbywa się za pomocą funkcji simplexml_load_file, poniżej znajdują się przykłady pracy z nim. Możesz także skorzystać z tej funkcji simplexml_load_string, tworzenie obiektu PHP z ciągu XML

Najpierw stwórzmy plik XML

W poniższym przykładzie zostanie wyświetlona tylko cena drugiego samochodu.

Aby wyświetlić od razu cały kod XML lub pojedynczy węzeł, używana jest metoda asXML().

simpleXML obsługuje również adresowanie przy użyciu języka XPath. Poniższy przykład wybierze wszystkie węzły „roku” i zwróci ich tablicę.

Zastępowanie wartości elementów odbywa się poprzez proste przypisanie wartości

Podczas zastępowania węzłów mających węzły podrzędne należy zachować ostrożność, ponieważ wszystkie węzły podrzędne zostaną usunięte.

W dwóch poprzednich przykładach dane XML znajdujące się w pamięć o dostępie swobodnym, ale nie zostały zapisane na dysku. Aby nadpisać dane w pliku należy skorzystać z funkcji plik_put_contents()

Możliwa jest także integracja simpleXML i Dom za pomocą funkcji Simplexml_import_dom().

Ten przykład pokaże, jak uzyskać wartość atrybutów elementu.

Element SimpleXMLE->asXML

SimpleXMLElement->asXML — Zwraca prawidłowo sformułowany dokument XML

Opis

Mieszane SimpleXMLElement->asXML()

Metoda asXML generuje dane w formacie XML w wersji 1.0.

Lista parametrów
Nazwa pliku
Jeśli określono, metoda zapisze dane do określonego pliku.
Zwracane wartości
Jeśli określono nazwę pliku, metoda zapisze dane XML do określonego pliku. W przeciwnym razie metoda zwróci dane XML w postaci ciągu znaków.
Uwagi
Jeżeli dokument źródłowy określił w nagłówkach kodowanie dokumentu XML za pomocą parametru encoding, to metoda asXML zwróci dokument XML w określonym kodowaniu. Zmiana kodowania dokumentu XML przy użyciu rozszerzenia SIMPLEXML nie jest możliwa.
Przykłady
Przykład 1: Wyjście XML

$ciąg =<<

tekst
rzeczy


kod

XML-a

echo $xml->asXML(); //tekstrzeczy
...?>

Metoda asXML może również działać z Xpath:

Przykład 2: Użycie metody asXML() z Xpath

// Kontynuacja powyższego przykładu.
/* Szukaj */
$wynik = $xml->xpath("/a/b/c");
while(list(, $node) = each($result)) (
echo $węzeł->asXML(); // tekst I rzeczy
}
?>

SimpleXMLElement->atrybuty

SimpleXMLElement->attributes — Zwraca atrybuty elementu.

Opis

SimpleXMLElement simplexml_element->atrybuty()

Funkcja ta zwraca nazwy i wartości atrybutów wybranego elementu XML. Uwaga: SimpleXML ma regułę dodawania właściwości iteracyjnych do większości metod. Nie można ich sprawdzić za pomocą var_dump() ani żadnego innego analizatora obiektów.

Przykład 1: Interpretacja ciągu XML

$ciąg =<<
[e-mail chroniony]

XML-a
$xml = simplexml_load_string($string);
foreach($xml->users->attributes() as $a => $b) (
echo $a,"="",$b,"\"\n";
}
?>

Ten przykład wyświetli:

Imię="Evgen"
wiek="27

SimpleXMLElement->dzieci

SimpleXMLElement->children — Zwraca elementy podrzędne dla danego elementu

Opis

SimpleXMLElement simplexml_element->dzieci()

Ta metoda znajduje elementy podrzędne dla danego elementu.

Uwaga: SimpleXML ma regułę dodawania właściwości iteracyjnych do większości metod. Nie można ich sprawdzić za pomocą var_dump() ani żadnego innego analizatora obiektów.

Przykład 1: Użycie metody dzieci().

$xml = simplexml_load_string(
"










");
Echo "

    ";
    foreach ($xml->children() jako $site) (
    Echo "
    " .$strona["nazwa"];
    foreach ($site->children() jako $subsite) (
    Echo "
    " .$podwitryna["nazwa"];
    }
    }
    Echo "
";
?>

Ten przykład wyświetli:

php-help.ru
linki.php-help.ru
forum.php-help.ru
serwer.php-spravka.ruyandex.ru
pieniądze.yandex.ru
map.yandex.ru
market.yandex.ru

SimpleXMLElement->xpath

SimpleXMLElement->xpath — Wykonuje zapytanie Xpath na danych XML

Opis

Tablica SimpleXMLElement->xpath (ścieżka ciągu)

Metoda xpath wyszukuje elementy podrzędne elementu SimpleXML, którego ścieżka jest określona w parametrze path. Metoda zwraca tablicę obiektów SimpleXMLElement.

Przykład 1. Xpath

$ciąg =<<

tekst
rzeczy


kod

zwykły



XML-a
$xml = simplexml_load_string($string);
/* Wyszukaj według */
$wynik = $xml->xpath("/a/b/c");
foreach ($wynik jako $węzeł) (
echo "/a/b/c: " . $węzeł. "
";
}
/* Ścieżki względne również działają... */
$wynik = $xml->xpath("b/c");
foreach ($wynik jako $węzeł) (
echo "b/c: " . $węzeł. "
";
}
?>

Ten skrypt wyświetli:

/a/b/c: tekst
/a/b/c:rzeczyb/c:tekstb/c:rzeczy

Dwa wyniki w ta sprawa są takie same.

simplexml_import_dom (PHP 5)

simplexml_import_dom — Zwraca obiekt SimpleXMLElement utworzony na podstawie obiektu DOM.

Opis

SimpleXMLElement simplexml_import_dom(węzeł DOMNode[, string nazwa_klasy])

Ta funkcja pobiera obiekt DOM i tworzy na jego podstawie obiekt SimpleXML.

Tego nowego obiektu można używać jak zwykłego obiektu SimpleXML.

Jeżeli podczas tworzenia obiektu wystąpiły błędy, metoda zwróci wartość false.

Przykład 1 Import DOM

$dom = nowy dokument dom;
$dom->loadXML(" php-spravka.ru");
if (!$dom) (
echo "Błąd podczas analizowania dokumentu!";
Wyjście;
}
$s = simplexml_import_dom($dom);
echo $s->strona->url; // php-help.ru
?>

simplexml_load_file (PHP 5)

simplexml_load_file – Interpretuje plik XML jako obiekt

Opis

Obiekt simplexml_load_file(string nazwa_pliku[, string nazwa_klasy[, int opcje]])

Ta funkcja interpretuje nazwę pliku z poprawnie sformułowanymi danymi XML w obiekcie SimpleXMLElement. Jeśli w danych XML są błędy, funkcja zwróci FAŁSZ.

Możesz użyć opcjonalnego parametru nazwa_klasy w funkcji simplexml_load_file(), aby funkcja zwróciła obiekt określonej klasy. W tym przypadku klasa musi być rozszerzeniem klasy SimpleXMLElement.

Od PHP 5.1.0 i Libxml 2.6.0 można używać opcjonalnego parametru opcji, którego specyfikacja jest opisana w dodatkowych parametrach Libxml.

Uwaga: Libxml 2 konwertuje adres URL do prawidłowej postaci. Te. jeśli chcesz ustawić a na b&c w ciągu adresu URL, nie musisz wykonywać:

Simplexml_load_file(rawurlencode("http://example.com/?a=" .urlencode("b&c"))).

Od wersji PHP 5.1.0 odbywa się to automatycznie.

Przykład 1: Interpretacja dokumentu XML

// Plik test.xml zawiera dokument XML z elementem głównym
// i zagnieżdżony element tytułu //title.if (file_exists("test.xml")) (
$xml = simplexml_load_file("test.xml");

Var_dump($xml);
) w przeciwnym razie (
exit("Błąd podczas otwierania pliku test.xml.");
}
?>
Ten przykład wyświetli następujący komunikat: Obiekt SimpleXMLElement(
=> Nagłówek testu
...
)

W ten przykład możesz uzyskać dostęp do elementu tytułu w następujący sposób: $xml->title.

simplexml_load_string (PHP 5)

simplexml_load_string — Interpretuje ciąg XML w obiekcie

Opis

Obiekt simplexml_load_string(string data[, string nazwa_klasy[, int opcje]])

Ta funkcja pobiera „poprawny” dokument XML w ciągu danych i zwraca obiekt klasy SimpleXMLElement, który ma właściwości równe zawartości dokumentu XML. Jeśli dokument XML zawiera błędy, funkcja zwróci FAŁSZ.

Możesz użyć opcjonalnego parametru nazwa_klasy, aby funkcja simplexml_load_string() zwróciła obiekt danej klasy. Ta klasa musi rozszerzać klasę SimpleXMLElement.

Począwszy od PHP 5.1.0 i Libxml 2.6.0 można także używać opcjonalnego parametru opcji, którego zawartość jest zdefiniowana w dodatkowych parametrach Libxml.

Przykład 1: Transformacja ciągu XML

$ciąg =<<

Czterdzieści Co?
Joe
Jane





XML-a
$xml = simplexml_load_string($string);
var_dump($xml);
?>
Ten przykład wyświetli: SimpleXMLElement Object(
=> Czterdzieści Co?
=> Joe
=> Jane
=>
Wiem, że to jest odpowiedź, ale jakie jest pytanie?
)

W tym przykładzie można także użyć konstrukcji $xml->body itp.

Jeśli zauważysz błąd, zaznacz fragment tekstu i naciśnij Ctrl + Enter
UDZIAŁ: