Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Parsowanie pliku xml/rdf z namespaces do obiektu/tablicy [SimpleXML]
Forum PHP.pl > Forum > PHP
WiruSSS
Witam

Posiadam pliki o strukturze rdf, które potrzebuję sparsować do tablicy w taki sposób, żeby mozna było ten proces później odwrócić. Na ten moment parser działa już tak, ze rozpoznaje poszczególne elementy które potrzebuje przetworzyć, wypluwa coś takiego:

  1. x:xmpmeta xmlns:x="value" x:xmptk="value"
  2. rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  3. rdf:Description rdf:about="" xmlns:aaa="value" xmlns:bbb="value" xmlns:ccc="value" xmlns:ddd="value" aaa:param="value" aaa:param2="value" bbb:param="value"
  4. ccc:Param
  5. rdf:Seq
  6. rdf:li
  7. value
  8. rdf:li
  9. rdf:li
  10. value2
  11. rdf:li
  12. rdf:li
  13. value3
  14. rdf:li
  15. rdf:Seq
  16. ccc:Param
  17. ddd:Param
  18. value
  19. ddd:Param
  20. rdf:Description
  21. rdf:RDF
  22. x:xmpmeta


oczywiście nic nie stoi na przeszkodzie zeby wypluwał '/' przy znacznikach zamykających jesli by to mialo w czyms pomóc. Potrzebuję to jakoś wrzucic do tablicy żebym mógl porównac ze soba kilka takich tablic, konkretnie porównywane bedą wszystkie 'value' poszczególnych parametrów

pozdrawiam
Crozin
1. Przecież RDF to zwykły XML, dlaczego nie wykorzystasz pierwszej lepszej biblioteki do jego obsługi?
2. Zamiast mapować dane do tablicy wykorzystaj obiekty. Będą znacznie wygodniejsze przy pracy, ze względu na możliwość indywidualnego określenia równości dwóch elementów jak i składowania metadanych.
WiruSSS
próbowałem uzyć simplexml ale sie sypie, być może te pliki nie spełniaja wszystkich wytycznych dla plików rdf ...bardzo prosze o info jak to przerzucic czy to do tablicy czy do obiektu
Crozin
1. Pokaż oryginalny plik i sprawdź czy jest on poprawnym XML-em: http://www.xmlvalidation.com/
2. Pokaż swój kod.
3. SimpleXML jest raczej słabą biblioteką, ale i ona poradzi sobie bez większego problemu z RDF-em: http://www.sitepoint.com/simplexml-and-namespaces/
spacja
Kod
http://stackoverflow.com/questions/2486722/parse-rdf-xml-file-to-get-all-rdfabout-values



Tutaj z wykorzystaniem rdf paraser
Kod
http://phpxmlclasses.sourceforge.net/php_rdf_tutorial.pdf



i jeszcze inna biblioteka :
Kod
https://github.com/semsol/arc2

smile.gif
WiruSSS
...jeszce raz sprawdziłem, simplexml zwraca pusty obiekt, sprawdziłem jeden z plików tym walidatorem wynika z niego ze ten plik jest poprawny. Jaką inną biblioteke mozesz polecić?
Crozin
Skoro SimpleXML zwraca Ci pusty obiekt dla niepustych danych wejściowych to... zapewne jest jakiś błąd, dlaczego go nie sprawdzisz?

1. Ponownie: pokaż kod.
2. http://www.php.net/manual/en/refs.xml.php
WiruSSS
ponizej link do przykladowego pliku, tak jak mówiłem nie jet to typowy plik rdf chocby ze wzgledu na rozszerzenie, ale to chyba nie powino mieć znaczenia.

http://clients.goodlux.com/tiffany/cr2/IMG_0390.xmp

[EDIT]

to niby jakoś tam parsuje, działa tylko w jedną strone, sparsowany plik nie wraca do swojej poprzedniej postaci po ponownym parsowaniu za pomocą tego narzędzia

[EDIT]

Ok prepraszam jesli jest to jakiś banalny problem ale z obiektowym php jak do tej pory miałem malo do czynienia i cięzko mi jest jeszce zrozumiec pewne rzeczy. Doszedłem do szegoś takiego:

  1. $xml = 'http://clients.goodlux.com/tiffany/cr2/IMG_0390.xmp';
  2.  
  3. $xml = simplexml_load_file($xml);
  4.  
  5. $ns = $xml->getNameSpaces(true);
  6. print_r($ns);
  7.  
  8. $x = $xml->children($ns['x']);
  9.  
  10. print_r($x);


rezultat jest taki

Kod
Array
(
    [x] => adobe:ns:meta/
    [rdf] => http://www.w3.org/1999/02/22-rdf-syntax-ns#
    [exif] => http://ns.adobe.com/exif/1.0/
    [aux] => http://ns.adobe.com/exif/1.0/aux/
    [tiff] => http://ns.adobe.com/tiff/1.0/
    [xap] => http://ns.adobe.com/xap/1.0/
    [dc] => http://purl.org/dc/elements/1.1/
    [crs] => http://ns.adobe.com/camera-raw-settings/1.0/
    [photoshop] => http://ns.adobe.com/photoshop/1.0/
)
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [xmptk] => Public XMP Toolkit Core 3.5
        )

)


[EDIT]

Więc wychodzi na to że mam dostęp do każdej gałezi z osobna

Potrzebowałbym zrobić tak, zeby caly ten plik znalazł się w jednym obiekcie/tablicy ...trochę zaczynam rozumieć o co chodzi z namespaces. Znalazłem kilka przykałdów jak się dostać do takich gałęzi jednak żaden z nich nie ma odzwierciedlenia w moim przypadku.

Z tego co widze to zwykłe pliki xml wyglądają dokładnie tak jakbym sobie tego zyczył natomiast obiekty z namespaces są 'dziurawe' ...czy istnieje jakas funkcja która wyswietli mi cały plik rdf w takiej formie jak zwykly plik xml ale z uwzglednieniem tych namespaces?

[EDIT]

Ok poradziłem w sobie w najbardziej prozaiczny z mozliwych sposobów, szkoda, ze wcześniej na to nie wpadłem tongue.gif
Dla potomnych jesli komuś by się miało przydać

  1. $xml = 'http://clients.goodlux.com/tiffany/cr2/IMG_0390.xmp';
  2. $xml = file_get_contents($xml);
  3. $xml = preg_replace('#([</][a-zA-Z]+):([a-zA-Z0-9]+)#', "$1___$2", $xml);
  4. $xml = preg_replace('#([a-zA-Z]+):([a-zA-Z0-9]+=)#', "$1___$2", $xml);
  5. $xml = simplexml_load_string($xml);
  6. print_r($xml);


...dokładnie tego mi było trzeba tongue.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.