Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
Tehnologii Web
procesarea datelor
XML/HTML (II)
SAX, procesări simplificate,
pr...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
„Înainte de a pune noi întrebări,
gândește-te dacă într-adevăr vrei
să cunoști ...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
Există maniere alternative
pentru procesarea documentelor XML?
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: intro
Scop:
consultarea documentelor XML/HTML
fără ca în prealabil să fie ...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: intro
Scop:
consultarea documentelor XML/HTML
fără ca în prealabil să fie ...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: caracterizare
Oferă o procesare XML secvențială (liniară),
bazată pe eveni...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: caracterizare
Oferă o procesare XML secvențială (liniară),
bazată pe eveni...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: caracterizare
Efort independent – de cel al Consorțiului Web –
de standard...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: caracterizare
Larg acceptat ca standard industrial
SAX 1.0 (1998)
implemen...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: caracterizare
Larg acceptat ca standard industrial
SAX 2.0 (2004)
suport p...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: procesare
Pentru fiecare tip de construcție XML
– început de tag, sfârșit ...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: procesare
Funcțiile/metodele de tratare se specifică
de către programator,...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: procesare
Minimal, trebuie definite funcțiile/metodele:
trateaza_tag_incep...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: procesare
Minimal, trebuie definite funcțiile/metodele:
trateaza_tag_incep...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: procesare
PHP: pentru fiecare eveniment de apariție a tag-ului de
început,...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/

Aplicație
client
Procesor (parser)
SAX
Instanțierea
handler-elor
notificare
a...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: procesare
Implementarea de referință (Java): org.xml.sax
detalii la
www.sa...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: procesare
Interfețe ce pot fi implementate de aplicația noastră:
ContentHa...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: procesare
Interfețe ce pot fi implementate de aplicația noastră:
Attribute...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: procesare
Interfețe ce pot fi implementate de aplicația noastră:
XMLReader...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: procesare
Interfețe ce pot fi implementate de aplicația noastră:
ErrorHand...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: procesare
Clasa SAX oferită:
InputSource
încapsulează informații despre o ...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
// prelucrare XML via evenimente (consultarea datelor)
public interface XMLRead...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
// utilizată pentru procesarea construcțiilor XML
public interface ContentHandl...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
// specifică atributele asociate unui element XML
public interface Attributes {...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: implementări
Expat – procesor XML cu suport pentru diverse metode
de prelu...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: implementări
NSXMLParser – implementare Objective-C + Swift (Apple)
develo...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: implementări
Xerces SAX API – platformă XML pentru C++ și Java:
xml.apache...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax: implementări – exemplificare
Procesarea în PHP unui document XML via SAX
p...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
<!-- document XML colectând subiecte de teste scrise -->
<subiecte materie="Teh...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
class parseXML {
private $xml_parser; // instanța analizorului XML
private $xml...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
// tratarea evenimentului de apariție a unui tag de început
private function st...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
public function parse() { // analiza propriu-zisă condusă de evenimente
$this->...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
// programul PHP ce afișează propunerile de subiecte de teste scrise
require("p...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
// programul PHP ce afișează propunerile de subiecte de teste scrise
require("p...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
(în loc de) pauză
When HTML is life…
www.reddit.com/r/ProgrammerHumor/
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax vs. dom
Când poate fi folosit SAX?
procesarea unor documente de mari dimens...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax vs. dom
Când poate fi folosit SAX?
crearea unei structuri noi de document X...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax vs. dom
Când poate fi folosit SAX?
crearea unei structuri noi de document X...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax vs. dom
Când poate fi utilizat DOM?
accesul direct la datele dintr-un docum...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax vs. dom
Când poate fi utilizat DOM?
necesitatea modificării și/sau salvării...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax vs. dom
DOM necesită încărcarea
completă în memorie
a documentului XML
în v...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax vs. dom
SAX preia fragmente reduse din document,
efectuându-se o prelucrare...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax vs. dom
SAX poate fi utilizat
pentru generarea de arbori DOM
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax vs. dom
SAX poate fi utilizat
pentru generarea de arbori DOM
Invers, arbori...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax vs. dom
SAX poate fi utilizat
pentru generarea de arbori DOM
Invers, arbori...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax vs. dom
În cazul unor structuri XML sofisticate,
maniera de procesare SAX p...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax vs. dom: exemplificare
Fie structura de document XML,
specificată prin urmă...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax vs. dom
Unele implementări SAX oferă suport
pentru validări de date, expres...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
sax vs. dom
Uzual, în funcție de necesități,
se folosesc și DOM și SAX
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
Există și alte metode de procesare XML?
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
Procesarea documentelor XML
alternative:
XPP – XML Pull Parsing
„legarea” datel...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative: xml pull parsing
Stiluri de procesări XML conduse de evenimente:
p...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative: xml pull parsing
Stiluri de procesări XML conduse de evenimente:
p...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative: xml pull parsing
Stiluri de procesări XML conduse de evenimente:
p...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative: xml pull parsing
Stiluri de procesări XML conduse de evenimente:
p...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative: xml pull parsing
Stiluri de procesări XML conduse de evenimente:
p...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
xml pull parsing – implementări
StAX – Streaming API for XML (Java) – JSR 173
e...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
xml pull parsing – implementări
irrXML – inițial, parte din Irrlicht 3D Engine ...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
Clasificare a manierelor de procesare XML
mod de accesare: secvenți...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
DOM
acces direct, în stilul pull
SAX
acces secvențial, în stilul pu...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
„Legarea” datelor XML de alte surse de date
(XML binding)
baze de d...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
XML binding
baze de date: XML infoset  dataset
specificația SQL/XM...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
baze de date: XML infoset  dataset
implementări concrete:
Oracle XML DB
docs.o...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
XML binding
abordare obiectuală:
date XML  clase create „din zbor”...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
abordare obiectuală:
date XML  clase create „din zbor”
exemple:
C++ – cereal: ...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
XML binding
interogări asupra datelor XML
direct în limbajul de pro...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
XDocument proiecte; // XDocument e o clasă .NET
proiecte = XDocument.Load ("pro...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
XML binding
JAXB – Java Architecture for XML Binding (JSR-222)
jcp....
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
XML binding
interoperabilitate cu alte formate: XML  JSON
nu exist...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
Procesarea XML simplificată
scop:
procesarea unui document XML (de ...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
Procesarea XML simplificată
uzual, adoptă maniera de prelucrare XPP...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
Procesarea XML simplificată
fiecărui element XML îi poate corespund...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
Procesarea XML simplificată
extensii PHP:
SimpleXML
php.net/manual/...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
// încărcăm documentul XML
$xml = simplexml_load_file('http://web.info/projects...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
simple xml: exemplificare
Preluarea unei știri dintr-un flux RSS
(document XML)...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
<rss version="2.0" xml:base="https://www.programmableweb.com/rss_blog">
<channe...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
define('FLUX', 'feed.rss.xml'); // poate fi folosit un URI real
// (e.g., https...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
{
"title" : "10 Top APIs for the Internet of Things ",
"link" : "http://feedpro...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
Procesarea XML simplificată
alte exemplificări:
libxml (C, C++ și a...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
Procesarea XML simplificată
pentru consultare, se poate folosit
un ...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
alternative
Procesarea XML simplificată
pentru generare, se poate utiliza
un „s...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
Cum pot fi procesate documentele HTML?
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
procesare html
Aspect de interes:
ignorarea erorilor de sintaxă
documente bine ...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
procesare html
Aspect de interes:
ignorarea erorilor de sintaxă
malformed markup
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
procesare html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
procesare html
Aspect de interes:
ignorarea erorilor de sintaxă
malformed marku...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
procesare html
Tehnica folosită uzual – nerecomandată
Web scraping
extragerea d...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
procesare html
Tehnica folosită uzual – nerecomandată
Web scraping
extragerea d...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
procesare html
Recurgerea la un procesor HTML/XML specific
scopuri importante:
...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
procesare html: instrumente
Beautiful Soup – bibliotecă Python
www.crummy.com/s...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
procesare html: instrumente
HTML-Parser – modul Perl
github.com/gisle/html-pars...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
procesare html: instrumente
Masterminds HTML5-PHP – procesor HTML5 în PHP
githu...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
procesare html: instrumente
HtmlCleaner – instrument implementat în Java pentru...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
procesare html: instrumente – exemplu
Preluarea datelor despre produse (albume ...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
procesare html: instrumenteincorect!
(malformed markup)
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
require_once('simple_html_dom.php');
define('URL', 'https://www.nicherecords.ro...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
procesare html: instrumente
reprezentarea HTML a datelor preluate de pe situl W...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
rezumat
⦑ ⦒
procesări XML: de la SAX la XPP și Simple XML
instrumente de preluc...
Dr.SabinBuragaprofs.info.uaic.ro/~busaco/
episodul viitor: servicii Web prin SOAP
sistem SOAP
codificare XML
✉
împachetar...
Nächste SlideShare
Wird geladen in …5
×

Web 2020 07/12: Procesarea datelor XML & HTML – Simple API for XML. Procesări simplificate

52 Aufrufe

Veröffentlicht am

Prelegere din cadrul materiei "Tehnologii Web" predată de Dr. Sabin Buraga.
Resurse suplimentare la https://profs.info.uaic.ro/~busaco/teach/courses/web/web-film.html

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Web 2020 07/12: Procesarea datelor XML & HTML – Simple API for XML. Procesări simplificate

  1. 1. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ Tehnologii Web procesarea datelor XML/HTML (II) SAX, procesări simplificate, prelucrarea datelor HTML Dr. Sabin Corneliu Buraga – profs.info.uaic.ro/~busaco/
  2. 2. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ „Înainte de a pune noi întrebări, gândește-te dacă într-adevăr vrei să cunoști răspunsul la ele.” Gene Wolfe
  3. 3. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ Există maniere alternative pentru procesarea documentelor XML?
  4. 4. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: intro Scop: consultarea documentelor XML/HTML fără ca în prealabil să fie construit arborele de noduri-obiect
  5. 5. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: intro Scop: consultarea documentelor XML/HTML fără ca în prealabil să fie construit arborele de noduri-obiect în contrast cu DOM, documentul nu trebuie stocat complet în memorie înainte de a fi efectiv prelucrat
  6. 6. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: caracterizare Oferă o procesare XML secvențială (liniară), bazată pe evenimente – event-oriented inițiator: David Megginson www.megginson.com/downloads/SAX/
  7. 7. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: caracterizare Oferă o procesare XML secvențială (liniară), bazată pe evenimente – event-oriented flux continuu de evenimente privind date XML oferindu-se suport doar pentru citire “SAX is a streaming interface – applications receive information from XML documents in a continuous stream, with no backtracking or navigation allowed”
  8. 8. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: caracterizare Efort independent – de cel al Consorțiului Web – de standardizare a procesării XML condusă de evenimente www.saxproject.org
  9. 9. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: caracterizare Larg acceptat ca standard industrial SAX 1.0 (1998) implementare de referință în limbajul Java org.xml.sax
  10. 10. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: caracterizare Larg acceptat ca standard industrial SAX 2.0 (2004) suport pentru spații de nume, diverse configurări + extensii
  11. 11. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: procesare Pentru fiecare tip de construcție XML – început de tag, sfârșit de tag, date (conținut), instrucțiune de procesare, comentariu,... – va fi emis un eveniment care va fi tratat de o funcție/metodă (handler)
  12. 12. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: procesare Funcțiile/metodele de tratare se specifică de către programator, pentru fiecare tip de construcție XML în parte
  13. 13. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: procesare Minimal, trebuie definite funcțiile/metodele: trateaza_tag_inceput (procesor, tag, atrib) trateaza_tag_sfarsit (procesor, tag) trateaza_date_caracter (procesor, date)
  14. 14. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: procesare Minimal, trebuie definite funcțiile/metodele: trateaza_tag_inceput (procesor, tag, atrib) trateaza_tag_sfarsit (procesor, tag) trateaza_date_caracter (procesor, date) conține lista atributelor atașate tag-ului de început instanța procesorului XML
  15. 15. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: procesare PHP: pentru fiecare eveniment de apariție a tag-ului de început, a tag-ului de sfârșit și a datelor-conținut, se atașează una din funcțiile de tratare, respectiv: set_element_handler (trateaza_tag_inceput, trateaza_tag_sfarsit) set_character_data_handler (trateaza_date_caracter) funcții sau metode definite de programator
  16. 16. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/  Aplicație client Procesor (parser) SAX Instanțierea handler-elor notificare apariție eveniment început de tag Procesare trimite evenimente SAX apelare handler  inițiere procesare: parse ( ) <projects> <project class="M"> … </project> </projects> apariție eveniment final de tag apelare handler etc. programul consumă și tratează evenimente produse de procesorul SAX
  17. 17. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: procesare Implementarea de referință (Java): org.xml.sax detalii la www.saxproject.org/apidoc/org/xml/sax/package-summary.html
  18. 18. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: procesare Interfețe ce pot fi implementate de aplicația noastră: ContentHandler rezolvă notificări de evenimente vizând tipul construcțiilor XML: început de document, tag de început, date textuale, tag de sfârșit, sfârșit de document etc.
  19. 19. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: procesare Interfețe ce pot fi implementate de aplicația noastră: Attributes conține lista atributelor specificate în cadrul unui tag de început
  20. 20. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: procesare Interfețe ce pot fi implementate de aplicația noastră: XMLReader specifică maniera de citire a datelor XML folosind metode de tratare a evenimentelor (callback-uri)
  21. 21. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: procesare Interfețe ce pot fi implementate de aplicația noastră: ErrorHandler specifică maniera de tratare a erorilor (fatale) și avertismentelor pot fi emise excepții precum SAXException și SAXParseException
  22. 22. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: procesare Clasa SAX oferită: InputSource încapsulează informații despre o sursă de intrare de unde se preiau datele XML (e.g., flux de caractere)
  23. 23. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ // prelucrare XML via evenimente (consultarea datelor) public interface XMLReader { // furnizarea de informații despre document public ContentHandler getContentHandler (); public DTDHandler getDTDHandler (); public EntityResolver getEntityResolver (); public ErrorHandler getErrorHandler (); // stabilirea diverselor funcționalități public void setContentHandler (ContentHandler contentHandler); public void setDTDHandler (DTDHandler dtdHandler); public void setEntityResolver (EntityResolver resolver); public void setErrorHandler (ErrorHandler errHandler); // procesarea propriu-zisă via un obiect InputSource sau un URI public void parse (InputSource in) throws java.io.IOException, SAXException; public void parse (String uri) throws java.io.IOException, SAXException; } Exemplificare: interfața XMLReader oferită de Apache Xerces – xerces.apache.org
  24. 24. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ // utilizată pentru procesarea construcțiilor XML public interface ContentHandler { public void setDocumentLocator (Locator locator); public void startDocument () throws SAXException; public void endDocument () throws SAXException; // evenimente – minimal, vor fi implementate aceste 3 metode: public void startElement (String uri, String localName, String qName, Attributes attributes) throws SAXException; public void endElement (String uri, String localName, String qName) throws SAXException; public void characters (char buf[], int offset, int length) throws SAXException; // informații suplimentare ce pot fi preluate din documentul procesat public void ignorableWhitespace (char buf[], int offset, int length) throws SAXException; public void startPrefixMapping (String prefix, String uri) throws SAXException; public void endPrefixMapping (String prefix) throws SAXException; } Exemplificare: interfața ContentHandler (Apache Xerces)
  25. 25. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ // specifică atributele asociate unui element XML public interface Attributes { public int getLength (); // lungimea listei atributelor unui element public String getType (int index); // tipul atributului public String getValue (int index); // valoarea atributului // acces la informațiile privitoare la numele atributului public String getQName (int index); // prefix spațiu de nume + nume atrib. public String getLocalName (int index); // numele propriu-zis al atributului public String getURI (int index); // URI-ul spațiului de nume // acces via spații de nume XML public int getIndex (String uri, String localName); public String getType (String uri, String localName); public String getValue (String uri, String localName); // acces via nume calificate (prefix:nume) public int getIndex (String qName); public String getType (String qName); public String getValue (String qName); } Exemplificare: interfața Attributes (Apache Xerces)
  26. 26. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: implementări Expat – procesor XML cu suport pentru diverse metode de prelucrare (DOM, SAX etc.): libexpat.github.io (C, C++, Lua, .NET, Objective-C, Perl, Python, Ruby, Tcl) libxml – bibliotecă open source: C, C++, Haskell, Scala,… lxml – bibliotecă Python: launchpad.net/lxml MSSAX – procesări SAX în C, C++, JavaScript; inclus în MSXML SDK (Software Development Kit)
  27. 27. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: implementări NSXMLParser – implementare Objective-C + Swift (Apple) developer.apple.com/documentation/foundation/xmlparser org.xml.sax – API de referință pentru Java REXML – procesor XML pentru Ruby QSAX – parte a mediului de dezvoltare Qt (C++) saxophonist, sax-js, xml-artist – module Node.js sax-wasm – procesor scris în WebAssembly
  28. 28. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: implementări Xerces SAX API – platformă XML pentru C++ și Java: xml.apache.org erlsom, xmerl_eventp – module Erlang xml – pachet Go: golang.org/pkg/encoding/xml/ XML::Parser – modul Perl bazat pe procesorul Expat xml_*( ) – funcții PHP: php.net/manual/en/book.xml.php xml.sax – Python: docs.python.org/3/library/xml.sax.html
  29. 29. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax: implementări – exemplificare Procesarea în PHP unui document XML via SAX pentru a genera o reprezentare HTML a datelor web-test.xml – document XML modelând date de intrare parseXML.php – clasa pentru prelucrarea documentelor XML subiecte-test.php – program afișând subiectele unor teste de studiat exemplele din arhivă
  30. 30. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ <!-- document XML colectând subiecte de teste scrise --> <subiecte materie="Tehnologii Web" data="2020-04-09"> <subiect>Ce este Web-ul?</subiect> <subiect>Unde e stocat un cookie?</subiect> <subiect>La ce este util limbajul XPath?</subiect> … </subiecte> subiecte-test.php parseXML.php require()
  31. 31. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ class parseXML { private $xml_parser; // instanța analizorului XML private $xml_file; // numele fișierului XML citit private $html_code; // codul HTML generat private $open_tags; // mulțimea subtituțiilor tag-urilor de început private $close_tags; // mulțimea subtituțiilor tag-urilor de sfârșit public function set_open_tags($tags) { $this->open_tags = $tags; } public function set_close_tags($tags) { $this->close_tags = $tags; } // stabilește numele fișierului XML procesat public function set_xml_file($file) { $this->xml_file = $file; } // furnizează codul HTML generat public function get_html_code() { return $this->html_code; } clasa oferind prelucrarea documentelor XML
  32. 32. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ // tratarea evenimentului de apariție a unui tag de început private function start_element($parser, $name, $attrs) { // dacă există în tabloul de substituții, va fi înlocuit cu conținutul precizat if ($format = $this->open_tags[$name]) $this->html_code .= $format; } // tratarea evenimentului de apariție a unui tag de sfârșit private function end_element($parser, $name) { if ($format = $this->close_tags[$name]) $this->html_code .= $format; } // tratarea evenimentului de aparitie a unor date de tip caracter private function character_data($parser, $data) { $this->html_code .= $data; } clasa oferind prelucrarea documentelor XML
  33. 33. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ public function parse() { // analiza propriu-zisă condusă de evenimente $this->xml_parser = xml_parser_create(); // instanțiază procesorul XML // înregistrează funcțiile de analiză ca fiind metode ale obiectului curent xml_set_object($this->xml_parser, $this); // setează opțiuni (tag-urile nu sunt rescrise cu caractere mari) xml_parser_set_option($this->xml_parser, XML_OPTION_CASE_FOLDING, false); // stabilește funcțiile de procesare a elementelor XML xml_set_element_handler($this->xml_parser, "start_element", "end_element"); xml_set_character_data_handler($this->xml_parser, "character_data"); if (!($fp = fopen($this->xml_file, "r"))) // deschide fișierul XML die("could not open XML source"); while ($data = fread($fp, 4096)) { // citește date în „calupuri” de 4KB if (!xml_parse($this->xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d", // eroare de procesare xml_error_string(xml_get_error_code($this->xml_parser)), xml_get_current_line_number($this->xml_parser))); } } } // parse } // class
  34. 34. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ // programul PHP ce afișează propunerile de subiecte de teste scrise require("parseXML.php"); // substituția via două tablouri asociative a elementelor XML cu cod HTML // (cheia = element XML de intrare, valoarea cheii = marcaj HTML rezultat) $open_tags = [ 'subiecte' => "<section><ol>", 'subiect' => "<li>" ]; $close_tags = [ 'subiecte' => "</ol></section>", 'subiect' => "</li>" ]; // instanțiază și inițializează analizorul $parser = new parseXML(); $parser->set_xml_file('web-test.xml'); $parser->set_open_tags($open_tags); $parser->set_close_tags($close_tags); // rulează analizorul XML $parser->parse(); echo $parser->get_html_code(); // redarea codului HTML generat
  35. 35. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ // programul PHP ce afișează propunerile de subiecte de teste scrise require("parseXML.php"); // substituția via două tablouri asociative a elementelor XML cu cod HTML // (cheia = element XML de intrare, valoarea cheii = marcaj HTML rezultat) $open_tags = [ 'subiecte' => "<section><ol>", 'subiect' => "<li>" ]; $close_tags = [ 'subiecte' => "</ol></section>", 'subiect' => "</li>" ]; // instanțiază și inițializează analizorul $parser = new parseXML(); $parser->set_xml_file('web-test.xml'); $parser->set_open_tags($open_tags); $parser->set_close_tags($close_tags); // rulează analizorul XML $parser->parse(); echo $parser->get_html_code(); // redarea codului HTML generat arborele DOM al reprezentării obținute
  36. 36. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ (în loc de) pauză When HTML is life… www.reddit.com/r/ProgrammerHumor/
  37. 37. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax vs. dom Când poate fi folosit SAX? procesarea unor documente de mari dimensiuni necesitatea abandonării procesării (procesorul SAX poate fi oprit oricând) extragerea unor informații de mici dimensiuni
  38. 38. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax vs. dom Când poate fi folosit SAX? crearea unei structuri noi de document XML utilizarea în contextul unor resurse de calcul reduse (memorie scăzută, lărgime de bandă îngustă,...)
  39. 39. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax vs. dom Când poate fi folosit SAX? crearea unei structuri noi de document XML utilizarea în contextul unor resurse de calcul reduse (memorie scăzută, lărgime de bandă îngustă,...) exemplificare pentru Android: developer.android.com/reference/javax/xml/parsers/SAXParser.html cod demonstrativ pentru iOS – SeismicXML: developer.apple.com/library/archive/samplecode/SeismicXML/
  40. 40. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax vs. dom Când poate fi utilizat DOM? accesul direct la datele dintr-un document XML procesări sofisticate filtrarea complexă a datelor via XPath efectuarea de transformări XSL validarea datelor XML prin DTD, XML Schema etc.
  41. 41. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax vs. dom Când poate fi utilizat DOM? necesitatea modificării și/sau salvării documentelor XML în contextul procesării datelor XML/HTML direct în cadrul navigatorului Web, date obținute eventual via transferuri asincrone prin Ajax
  42. 42. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax vs. dom DOM necesită încărcarea completă în memorie a documentului XML în vederea procesării ca arbore HTML HtmlElement HTML BodyElement HTML AsideElement Text HTML DivElement HTML ImageElement
  43. 43. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax vs. dom SAX preia fragmente reduse din document, efectuându-se o prelucrare liniară (șir de evenimente) start tag start tag characters end tag end tag
  44. 44. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax vs. dom SAX poate fi utilizat pentru generarea de arbori DOM
  45. 45. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax vs. dom SAX poate fi utilizat pentru generarea de arbori DOM Invers, arborii DOM pot fi traversați pentru a se emite evenimente SAX
  46. 46. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax vs. dom SAX poate fi utilizat pentru generarea de arbori DOM Invers, arborii DOM pot fi traversați pentru a se emite evenimente SAX exemplificări: modulul dom-js (Node.js), biblioteca lxml (Python)
  47. 47. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax vs. dom În cazul unor structuri XML sofisticate, maniera de procesare SAX poate fi inadecvată procesările SAX ignoră contextul apariției unui anumit element
  48. 48. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax vs. dom: exemplificare Fie structura de document XML, specificată prin următorul DTD: <!DOCTYPE catalog [ <!ELEMENT catalog (categ+)> <!ELEMENT categ (#PCDATA | categ)*> ]> Ce metodă de procesare s-ar preta, dacă numărul de elemente <categ> ar fi foarte mare?
  49. 49. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax vs. dom Unele implementări SAX oferă suport pentru validări de date, expresii XPath și transformări
  50. 50. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ sax vs. dom Uzual, în funcție de necesități, se folosesc și DOM și SAX
  51. 51. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ Există și alte metode de procesare XML?
  52. 52. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ Procesarea documentelor XML alternative: XPP – XML Pull Parsing „legarea” datelor XML procesare simplificată
  53. 53. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative: xml pull parsing Stiluri de procesări XML conduse de evenimente: push versus pull avansat
  54. 54. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative: xml pull parsing Stiluri de procesări XML conduse de evenimente: push = procesorul XML citește date XML și notifică aplicația asupra evenimentelor survenite (parsing events) – SAX avansat
  55. 55. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative: xml pull parsing Stiluri de procesări XML conduse de evenimente: push = procesorul XML citește date XML și notifică aplicația asupra evenimentelor survenite (parsing events) – SAX programul nu poate face cereri de evenimente ele apar așa cum sunt trimise (push) de procesor avansat
  56. 56. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative: xml pull parsing Stiluri de procesări XML conduse de evenimente: pull = aplicația controlează maniera de procesare și poate solicita (pull) procesorului următorul eveniment XML XPP – XML Pull Parsing www.xmlpull.org avansat
  57. 57. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative: xml pull parsing Stiluri de procesări XML conduse de evenimente: pull = aplicația controlează maniera de procesare și poate solicita (pull) procesorului următorul eveniment XML XPP – XML Pull Parsing structura codului-sursă al programului reflectă structura documentului XML prelucrat avansat
  58. 58. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ xml pull parsing – implementări StAX – Streaming API for XML (Java) – JSR 173 exemple de implementări: Aalto – github.com/FasterXML/aalto-xml Javolution – axat asupra performanței: javolution.org Oracle StAX – inclus în XDK (XML Developer’s Kit) docs.oracle.com/javase/tutorial/jaxp/stax/ Woodstox – github.com/FasterXML/woodstox avansat
  59. 59. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ xml pull parsing – implementări irrXML – inițial, parte din Irrlicht 3D Engine (C++) pull – pachet Scala de procesare XPP QXmlStreamReader, QXmlStreamWriter din mediul Qt (C++) saxpath – modul Node.js permițând evaluarea de expresii XPath pentru un flux de evenimente SAX xml.dom.pulldom – soluție Python XmlPullParser – interfață Java pentru Android avansat
  60. 60. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative Clasificare a manierelor de procesare XML mod de accesare: secvențial vs. direct (random) controlul fluxului de evenimente: pull vs. push managementul arborelui: ierarhic vs. imbricat avansat
  61. 61. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative DOM acces direct, în stilul pull SAX acces secvențial, în stilul push XPP și .NET XmlTextReader acces secvențial, în stilul pull avansat
  62. 62. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative „Legarea” datelor XML de alte surse de date (XML binding) baze de date: XML infoset  dataset  <doc> <xml /> <!-- … --> </doc> Id P A S 1 … … … 2 … … … 3 … … … <doc> <xml /> <!-- … --> </doc> data sets (tables) arbore DOM (în memorie) fișier XML DBMS
  63. 63. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative XML binding baze de date: XML infoset  dataset specificația SQL/XML – vezi standardul SQL:2016-14 aspecte de interes: tipul XML pentru valori ale câmpurilor tabelelor recurgerea la predicate + funcții specifice XML
  64. 64. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ baze de date: XML infoset  dataset implementări concrete: Oracle XML DB docs.oracle.com/cd/B28359_01/appdev.111/b28369/xdb01int.htm a se consulta și SQLXML (J2SE 8+) docs.oracle.com/javase/tutorial/jdbc/basics/sqlxml.html pureXML (IBM DB2) www.ibm.com/developerworks/data/library/techarticle/dm-0603saracco2/ XML Data (Microsoft SQL Server) docs.microsoft.com/en-us/sql/relational-databases/xml/xml-data-sql-server a se studia și clasa SqlXml (.NET Framework) docs.microsoft.com/en-us/dotnet/api/system.data.sqltypes.sqlxml XML Functions (PostgreSQL) www.postgresql.org/docs/current/static/functions-xml.html
  65. 65. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative XML binding abordare obiectuală: date XML  clase create „din zbor” (serialization, marshalling)
  66. 66. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ abordare obiectuală: date XML  clase create „din zbor” exemple: C++ – cereal: uscilab.github.io/cereal/ C++, C#, Go, Java, Ruby, Python,… – Protocol Buffers developers.google.com/protocol-buffers/ JS – node-xml2js: github.com/Leonidas-from-XIV/node-xml2js .NET (C# et al.) – clasa XmlSerializer docs.microsoft.com/en-us/dotnet/standard/serialization/introducing-xml-serialization PHP – extensia SimpleXML Python – Untangle: github.com/stchris/untangle Scala – scalaxb: scalaxb.org avansat
  67. 67. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative XML binding interogări asupra datelor XML direct în limbajul de programare LINQ (Language INtegrated Query) – .NET Framework docs.microsoft.com/dotnet/articles/csharp/programming-guide/concepts/linq/linq-to-xml resurse de interes: github.com/aloisdg/awesome-linq avansat
  68. 68. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ XDocument proiecte; // XDocument e o clasă .NET proiecte = XDocument.Load ("projects.xml"); var proiecteM = // via o expresie LINQ, preluăm toate proiectele from p in proiecte.Descendants ("project") // din care le alegem pe cele de clasa 'M' where (String) p.Attribute ("class") == "M" // ordonate după numărul de studenți orderby (String) p.Element ("stud") // selectând doar titlul acestora select (String) p.Element ("title"); // afișăm titlul proiectelor de clasa 'M' foreach (var proiect in proiecteM) { Console.WriteLine (proiect); } // același rezultat, recurgând la XPath var proiecteM2 = (IEnumerable) proiecte.XPathEvaluate ("//project[@class='M']/title"); avansat
  69. 69. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative XML binding JAXB – Java Architecture for XML Binding (JSR-222) jcp.org/en/jsr/detail?id=222 tutorial: docs.oracle.com/javase/tutorial/jaxb/ implementarea de referință: github.com/eclipse-ee4j/jaxb-ri de experimentat și EclipseLink: www.eclipse.org/eclipselink/ avansat
  70. 70. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative XML binding interoperabilitate cu alte formate: XML  JSON nu există o metodă standardizată exemplificări de instrumente și biblioteci: Apache Camel (Java), js2xmlparser (Node.js), JSON-lib (Java), ruby-xml-to-json, x2js (JavaScript), xml2json (Node.js), xml-to-json (Haskell), xmlutils.py avansat
  71. 71. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative Procesarea XML simplificată scop: procesarea unui document XML (de mici dimensiuni) direct în memorie, în manieră obiectuală, diferită de DOM
  72. 72. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative Procesarea XML simplificată uzual, adoptă maniera de prelucrare XPP (XML Pull Parsing)
  73. 73. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative Procesarea XML simplificată fiecărui element XML îi poate corespunde o proprietate a unui obiect atributele asociate elementelor XML pot fi modelate via o structură de date – e.g., tablou asociativ
  74. 74. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative Procesarea XML simplificată extensii PHP: SimpleXML php.net/manual/en/book.simplexml.php XMLReader www.php.net/manual/en/book.xmlreader.php XMLWriter www.php.net/manual/en/book.xmlwriter.php
  75. 75. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ // încărcăm documentul XML $xml = simplexml_load_file('http://web.info/projects.xml'); // afișăm descrierile proiectelor de clasă M foreach ($xml->project as $proj) { if ($proj['class'] == 'M') { echo '<p>' . $proj->desc . '</p>'; } } // similar, dar utilizând XPath foreach ($xml->xpath("//project[@class='M']") as $proj) { echo '<p>' . $proj->desc . '</p>'; } de consultat exemplele din arhivă
  76. 76. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ simple xml: exemplificare Preluarea unei știri dintr-un flux RSS (document XML) pentru a genera prin program o reprezentare JSON a datelor de interes feed.rss.xml – document XML modelând știri oferite de un sit rss2json.php – programul PHP de conversie a datelor de studiat exemplele din arhivă
  77. 77. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ <rss version="2.0" xml:base="https://www.programmableweb.com/rss_blog"> <channel> <title>ProgrammableWeb</title> <link>https://www.programmableweb.com/rss_blog</link> </channel> <!-- date despre o știre --> <item> <title>10 Top APIs for the Internet of Things</title> <link> http://feedproxy.google.com/~r/ProgrammableWeb/~3/h3VsGYmzNxg/29 </link> <description>…</description> <pubDate>Sun, 29 Mar 2020 14:46:24 -0400</pubDate> <guid isPermaLink="false">77881259158</guid> <!-- alte marcaje --> </item> <!-- alte elemente item… --> </rss> datele intrare modelate de documentul RSS
  78. 78. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ define('FLUX', 'feed.rss.xml'); // poate fi folosit un URI real // (e.g., https://feeds.feedburner.com/ProgrammableWeb) $json = ''; // va conține datele JSON generate prin program $xml = @simplexml_load_file(FLUX); // folosim o expresie XPath pentru a prelua prima știre din fluxul RSS $stire = $xml->xpath("//item")[0]; // obiectul JSON va include proprietățile 'title' (titlul știrii), // 'link' (adresa Web) și 'date' (data publicării) preluate din documentul RSS $json .= "{ "title" : "" . $stire->title . "","; $json .= " "link" : "" . $stire->link . "","; $json .= " "date" : "" . $stire->pubDate . "" }"; // trimitem datele spre client folosind câmpul MIME (Media Type) adecvat header("Content-type: application/json; charset=utf-8"); echo $json;
  79. 79. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ { "title" : "10 Top APIs for the Internet of Things ", "link" : "http://feedproxy.google.com/…/h3VsGYmzNxg/29", "date" : "Sun, 29 Mar 2020 14:46:24 -0400" } datele JSON generate pe server și trimise clientului Web
  80. 80. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative Procesarea XML simplificată alte exemplificări: libxml (C, C++ și alte limbaje) XML::Simple + XML::Writer (Perl) XmlSimple (Ruby) XmlTextReader + XmlTextWriter (.NET) avansat
  81. 81. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative Procesarea XML simplificată pentru consultare, se poate folosit un „cititor” (reader): XMLReader exemple: modulul xmlreader pentru Node.js xmlReader oferit de biblioteca libxml (C et al.) XMLReader (PHP) clasa XmlReader oferită de .NET (C# et al.)
  82. 82. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ alternative Procesarea XML simplificată pentru generare, se poate utiliza un „scriitor” (writer): XMLWriter exemplificări: clasa XmlWriter pentru .NET xmlWriter din cadrul bibliotecii libxml (C et al.) XMLWriter (PHP) modulul xml-writer pentru Node.js
  83. 83. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ Cum pot fi procesate documentele HTML?
  84. 84. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ procesare html Aspect de interes: ignorarea erorilor de sintaxă documente bine formatate (well formed) respectarea regulilor minimale privind marcajele versus documente valide conform unei scheme de validare – e.g., DTD
  85. 85. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ procesare html Aspect de interes: ignorarea erorilor de sintaxă malformed markup
  86. 86. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ procesare html
  87. 87. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ procesare html Aspect de interes: ignorarea erorilor de sintaxă malformed markup sunt relativ rare cazurile în care documentele HTML sunt scrise/generate corect
  88. 88. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ procesare html Tehnica folosită uzual – nerecomandată Web scraping extragerea datelor de interes prin prelucrarea – de obicei, empirică – a marcajelor HTML
  89. 89. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ procesare html Tehnica folosită uzual – nerecomandată Web scraping extragerea datelor de interes prin prelucrarea – de obicei, empirică – a marcajelor HTML un exemplu recurgând la expresii regulate 😰 scraping.pro/scraping-in-php-with-curl/
  90. 90. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ procesare html Recurgerea la un procesor HTML/XML specific scopuri importante: traversarea (procesarea) unei pagini Web – e.g., via DOM + detectarea și repararea erorilor sintactice (HTML clean) vezi și cursurile anterioare
  91. 91. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ procesare html: instrumente Beautiful Soup – bibliotecă Python www.crummy.com/software/BeautifulSoup/ goquery și soup – biblioteci Go github.com/PuerkitoBio/goquery github.com/anaskhan96/soup html5lib – procesare + serializare HTML pentru Python github.com/html5lib
  92. 92. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ procesare html: instrumente HTML-Parser – modul Perl github.com/gisle/html-parser HAP (Html Agility Pack) – bibliotecă .NET (C#) html-agility-pack.net Jericho HTML Parser – bibliotecă Java de procesare HTML jericho.htmlparser.net jsoup – bibliotecă Java pentru HTML5 jsoup.org
  93. 93. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ procesare html: instrumente Masterminds HTML5-PHP – procesor HTML5 în PHP github.com/Masterminds/html5-php Parse5 – modul Node.js github.com/inikulin/parse5 Simple HTML DOM Parser – bibliotecă PHP simplehtmldom.sourceforge.io SwiftSoup – bibliotecă Swift (macOS, iOS, tvOS + Linux) github.com/scinfu/SwiftSoup
  94. 94. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ procesare html: instrumente HtmlCleaner – instrument implementat în Java pentru corectarea marcajelor HTML eronate HTML Purifier – verificare + filtrare a marcajelor HTML (inclusiv vizând atacuri de tip XSS – Cross Site Scripting) cu implementări în PHP și Objective-C NekoHTML – procesor Java pentru HTML bazat pe Xerces cu suport pentru rezolvarea erorilor sintactice Validator.nu – procesor Java folosind DOM ori SAX cu semnalarea erorilor de sintaxă HTML5
  95. 95. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ procesare html: instrumente – exemplu Preluarea datelor despre produse (albume musicale) – denumire, cod de bare și preț – din documente HTML (invalide) oferite de un sit Web de profil se recurge la biblioteca Simple HTML DOM Parser pentru PHP, disponibilă sub licență deschisă (open source)
  96. 96. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ procesare html: instrumenteincorect! (malformed markup)
  97. 97. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ require_once('simple_html_dom.php'); define('URL', 'https://www.nicherecords.ro/catalog/'); // URL-ul sitului sursă $cai_produse = [ // căile spre produse (i.e. documentele HTML procesate) "pop-rock/rock-psihedelic/pink-floyd-the-wall-dvd.html", "jazz/jazz-1/nina-simone-silk-soul-vinyl.html", "clasica/clasica-1/bach-simply-bach-cd.html", "metal/heavy-metal/king-diamond-graveyard-vinyl-1.html" ]; foreach ($cai_produse as $cale) { // preluăm date despre fiecare produs $html = file_get_html(URL . $cale); $prod = $html->find("span.alb", 0)->plaintext; $cod_bare = explode(": ", $html->find("span.barcode", 0)->plaintext)[1]; $pret = (int) explode(" ", $html->find("span.price", 0)->plaintext)[0]; printf("<p><a title='Detalii' href='%s'>%s</a> &ndash; cod de bare: <code>%s</code>, preț: %d RON.</p>", URL . $cale, $prod, $cod_bare, $pret); }
  98. 98. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ procesare html: instrumente reprezentarea HTML a datelor preluate de pe situl Web
  99. 99. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ rezumat ⦑ ⦒ procesări XML: de la SAX la XPP și Simple XML instrumente de prelucrare a documentelor HTML mulțumiri lui Andrei Panu, PhD
  100. 100. Dr.SabinBuragaprofs.info.uaic.ro/~busaco/ episodul viitor: servicii Web prin SOAP sistem SOAP codificare XML ✉ împachetare date sistem SOAP decodificare XML ✉ despachetare date protocol de transport protocol de transport→ → mesaj SOAP legare (binding) expeditor (sender) destinatar (receiver)orice tip de date Internet (intermediari)

×