Toon posts:

[xml php] XML en XSD parsen met PHP

Pagina: 1
Acties:
  • 288 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Met de volgende code parse ik een XML en een XSL bestand:

PHP:
1
2
3
4
$xh = xslt_create(); 
$result= xslt_process($xh,$xmlfile,$xslfile);
xslt_free($xh);
echo $result;


Bestaat er ook zoiets voor XML in combinatie met XSD schema's?

Verwijderd

Topicstarter
Is het anders mogelijk om op een andere manier een XML en XSD schema te laten communiceren

  • Croccifixio
  • Registratie: Maart 2002
  • Laatst online: 01-04-2025
Verwijderd schreef op 05 november 2002 @ 11:41:
Met de volgende code parse ik een XML en een XSL bestand:

PHP:
1
2
3
4
$xh = xslt_create(); 
$result= xslt_process($xh,$xmlfile,$xslfile);
xslt_free($xh);
echo $result;


Bestaat er ook zoiets voor XML in combinatie met XSD schema's?
Dat hoeft toch niet te bestaan? Als het goed is zet je een verwijzing in je XML bestand naar je XSD bestand; dit geeft dus aan dat je XML bestand eruit ziet als is aangegeven in je XSD bestand. Dus er valt niks te parsen.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

offtopic:
correct me if i'm wrong:
Met een XSD wordt niet geparsed, met een XSD wordt ge-analyzeerd

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Croccifixio
  • Registratie: Maart 2002
  • Laatst online: 01-04-2025
drm schreef op 05 november 2002 @ 12:40:
offtopic:
correct me if i'm wrong:
Met een XSD wordt niet geparsed, met een XSD wordt ge-analyzeerd
Is niet offtopic. Je hebt helemaal gelijk :).

De topicstarter denkt kennelijk dat de XSD geparsed moet worden. Terwijl dit niet kan.

  • vargo
  • Registratie: Januari 2001
  • Laatst online: 29-08 20:39
Ik heb me er nog niet erg veel in kunnen verdiepen, maar een xsd is toch bedoelt om een xml te valideren (net zoiets als een dtd, maar die kijkt enkel naar elementen)?
Zou het niet kunnen dat hij doelt op het valideren van een xml aan de hand van een xsd - serversided, met php?

Plz tell me als ik ernaast zit...

Verwijderd

Topicstarter
Precies dat bedoel ik..

  • Croccifixio
  • Registratie: Maart 2002
  • Laatst online: 01-04-2025
vargo schreef op 05 november 2002 @ 13:32:
Ik heb me er nog niet erg veel in kunnen verdiepen, maar een xsd is toch bedoelt om een xml te valideren (net zoiets als een dtd, maar die kijkt enkel naar elementen)?
Zou het niet kunnen dat hij doelt op het valideren van een xml aan de hand van een xsd - serversided, met php?

Plz tell me als ik ernaast zit...
In je XML bestand maak je een verwijzing naar je XSD bestand. Op het moment dat je XML bestand wordt geladen, wordt het XML bestand meteen gevalideerd tegen het XSD bestand.
Een andere manier is er naar mijn weten niet.

Verwijderd

Topicstarter
Hoe wordt er dan gecheckt of het xml bestand OK is?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Dat wou ik zeggen, als je XML niet gevalideerd is tegen het XSD, dan kan de XML niet geparsed worden, gezien de logische volgorde bij het "verwerken" van een taal eerst de analyze is en dan het parsen. Mocht het analyseren niet lukken, kan het parsen ook niet plaatsvinden.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Croccifixio
  • Registratie: Maart 2002
  • Laatst online: 01-04-2025
Verwijderd schreef op 05 november 2002 @ 13:55:
Hoe wordt er dan gecheckt of het xml bestand OK is?
Zoals ik al zeg. Je hebt een verwijzing in je XML bestand naar het XSD bestand. Op het moment dat het XML bestand wordt geparsed, wordt deze eerst gevalideerd met behulp van het XSD bestand. Dat gebeurt automagisch.

Ik ben geen goeroe op dit gebied hoor, dus ik hoor het graag als ik het fout heb. Ik heb voor een practicum een webwinkel moeten bouwen, waarvan 1 versie met behulp van XML. We parsten het XML bestand in ASP en daarna werd er een stylesheet overheen gegooid. Het valideren gebeurde automagisch door de verwijzing naar het XSD bestand. Is het XML bestand niet valid, dan kan deze ook niet geparsed worden en krijg je een foutmelding.

[ Voor 0% gewijzigd door Croccifixio op 05-11-2002 14:15 . Reden: typo ]


Verwijderd

Topicstarter
Dus er is eigenlijk geen parser nodig? Maar hoe kan ik dan achterhalen of die xml correct is aan de xsd? bijvoorbeeld ik heb de volgende twee bestanden:

test.xml
code:
1
2
3
4
<?xml version="1.0"?>
<greeting  xsi:noNamespaceSchemaLocation="test.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
testing
</greeting>


test.xsd

code:
1
2
3
4
5
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="tintel" type="xsd:string"/>

</xsd:schema>


Deze xml zou moeten kloppen aan de xsd. Allen als deze niet zou kloppen, waar merk ik dat aan.

  • vargo
  • Registratie: Januari 2001
  • Laatst online: 29-08 20:39
Ze hebben gelijk hoor - doordat je hem in je bovenstaande code parsed (had ik niet gezien; stom 8)7), zou je xml bestand al aan de hand van je xsd moeten worden gevalideerd.
Zorg er maar eens voor dat je xsd niet klopt t.o.v. je xml bestand en je zou een foutmelding moeten krijgen...

  • Croccifixio
  • Registratie: Maart 2002
  • Laatst online: 01-04-2025
Verwijderd schreef op 05 november 2002 @ 14:32:
Dus er is eigenlijk geen parser nodig? Maar hoe kan ik dan achterhalen of die xml correct is aan de xsd? bijvoorbeeld ik heb de volgende twee bestanden:

test.xml
code:
1
2
3
4
5
<?xml version="1.0"?>
<greeting  xsi:noNamespaceSchemaLocation="test.xsd" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
testing
</greeting>


test.xsd

code:
1
2
3
4
5
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="tintel" type="xsd:string"/>

</xsd:schema>


Deze xml zou moeten kloppen aan de xsd. Allen als deze niet zou kloppen, waar merk ik dat aan.
Nee, die XML is dus niet valid volgens de XSD. Je hebt een element 'tintel' in je XSD staan die niet in je XML voorkomt. Verder gebruik je in je XML elementen die niet gedefinieerd zijn in je XSD.

Ik zal hier een voorbeeld geven van een XSD en XML bestand geven uit mijn practicum. Misschien dat dat je een beetje helpt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="<URL van je target namespace invullen>"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="<URL van je namespace
invullen>" elementFormDefault="qualified">
<xs:element name="productList">
  <xs:complexType>
  <xs:sequence minOccurs="0" maxOccurs="unbounded">
    <xs:element name="product">
    <xs:complexType>
    <xs:sequence>
      <xs:element name="typeID" type="xs:integer"/>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="specification" type="xs:string"/>
      <xs:element name="price">
      <xs:simpleType>
        <xs:restriction base="xs:double">
        <xs:minInclusive value="0"/>
        </xs:restriction>
      </xs:simpleType>
      </xs:element>
      </xs:sequence>
        <xs:attribute name="productID" type="xs:integer" use="required"/>
      </xs:complexType>
      </xs:element>
  </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<productList xmlns="<URL van je namespace>" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="<URL van je XSD locatie>">
   <product productID="1">
      <typeID>1</typeID>
      <name>XBox</name>
      <specification>XBox video game system</specification>
      <price>100</price>
   </product>
   
  <product productID="2">
      <typeID>2</typeID>
      <name>Advanced Controller</name>
      <specification>Advanced Controller</specification>
      <price>25</price>
   </product>
</productList>

[ Voor 0% gewijzigd door Croccifixio op 05-11-2002 16:45 . Reden: layout ]


Verwijderd

Topicstarter
Al heb je die twee bestanden dan hoe krijg ik dan de informatie of die XML valid is volgens het xsd schema

  • Croccifixio
  • Registratie: Maart 2002
  • Laatst online: 01-04-2025
Verwijderd schreef op 06 november 2002 @ 09:47:
Al heb je die twee bestanden dan hoe krijg ik dan de informatie of die XML valid is volgens het xsd schema
Dat gebeurt dus automagisch als je het XML bestand parsed, door de verwijzing in het XML bestand naar het XSD bestand.
Is het XML bestand niet valid, dan krijg je een fout bij het parsen. Is het XML bestand wel valid, dan krijg je geen fout.

Hier nog een stukje uit de API die was geschreven. Dit is weliswaar in ASP, maar ik neem aan dat de gang van zaken taal-onafhankelijk is.

code:
1
2
3
4
5
6
7
Function loadXMLFile(ByRef xmlObj, ByVal fileName)
    set xmlObj = Server.CreateObject("Microsoft.XMLDOM")
    xmlObj.async = false
    xmlObj.load(Server.MapPath(fileName))
    
    loadXMLFile = true
End Function


Met deze functie wordt een XML of een XSL bestand geladen. Bij 'xmlObj.load(Server.MapPath(fileName))' zal een fout optreden indien er een XML bestand wordt geladen en dit XML bestand is niet valid volgens de regels van het XSD bestand, waar een verwijzing naar staat in het XML bestand.

Dit 'parsen' van het XSD bestand en het controleren van het XML bestand doe je dus niet handmatig, maar gebeurt automatisch bij het laden van het XML bestand.

Verwijderd

Topicstarter
Ik werk voornamelijk met php. Kan ik daar dan bijvoorbeeld de functies xml_parser_create en xml_parse gebruiken

  • Croccifixio
  • Registratie: Maart 2002
  • Laatst online: 01-04-2025
Verwijderd schreef op 06 november 2002 @ 10:15:
Ik werk voornamelijk met php. Kan ik daar dan bijvoorbeeld de functies xml_parser_create en xml_parse gebruiken
Dat weet ik helaas niet, ik heb nog geen ervaring met PHP. Dit staat voor over een paar maanden op de agenda.

Verwijderd

Topicstarter
Maar uit die ASP functie komt een bepaalde waarde neem ik aan bijvoorbeeld True als de XML valid is aan de XSD en False als dat niet zo is?

Verwijderd

Niet over XSD maar DTD modus;

Als je het via DOM regelt in PHP, dan moet je een wat installeren op je bak. Je krijgt dan ook een tooltje, xmllint.

/usr/local/bin/xmllint --help
Usage : /usr/local/bin/xmllint [options] XMLfiles ...
--dtdvalid URL : do a posteriori validation against a given DTD

Hiermee kan je XML files valideren tegen een DTD; helaas niet tegen een XSD, maar wellicht kan je zelf van je XSD een DTD maken. En anders kan XMLSpy dat wel voor je 8).


Zie ook http://nl.php.net/manual/nl/ref.domxml.php

[ Voor 0% gewijzigd door Verwijderd op 06-11-2002 10:27 . Reden: textuele aanpassing ]


  • Croccifixio
  • Registratie: Maart 2002
  • Laatst online: 01-04-2025
Verwijderd schreef op 06 november 2002 @ 10:20:
Maar uit die ASP functie komt een bepaalde waarde neem ik aan bijvoorbeeld True als de XML valid is aan de XSD en False als dat niet zo is?
Als er iets fout gaat, dan klapt 'ie uit de functie en krijg je een foutmelding te zien.

Ik kijk nog even naar je eerste post:
Verwijderd schreef op 05 november 2002 @ 11:41:
Met de volgende code parse ik een XML en een XSL bestand:

PHP:
1
2
3
4
$xh = xslt_create(); 
$result= xslt_process($xh,$xmlfile,$xslfile);
xslt_free($xh);
echo $result;


Bestaat er ook zoiets voor XML in combinatie met XSD schema's?
Hier mis je dus het parsen van je XML document. Je gooit namelijk meteen je XSL bestand over het XML document. Terwijl je dus eerst het XML document moet parsen, waarbij deze wordt gevalideerd aan de hand van het XSD document. En daarna gooi je je stylesheet over het XML object heen.

In ASP.

code:
1
2
3
4
5
6
7
8
9
10
<%
' laad xml-data
result = loadXMLFile(dat, "data/productList.xml")
result = getProdOfType(dat, typ)

' laad xsl-stylesheet
result = loadXMLFile(sty, "style/product_list.xsl")

Response.Write(dat.transformNode(sty))
%>

Verwijderd

Topicstarter
Ik heb nu het volgende bestand

PHP:
1
2
3
4
5
6
7
$file = "greeting.xml";

$xml_parser = xml_parser_create();
$result = xml_parse($xml_parser,$file);
xml_parser_free($xml_parser);

echo $result;


Alleen is de output altijd 1

Dat is niet goed dacht ik

  • Croccifixio
  • Registratie: Maart 2002
  • Laatst online: 01-04-2025
Verwijderd schreef op 06 november 2002 @ 10:34:
Ik heb nu het volgende bestand

PHP:
1
2
3
4
5
6
7
$file = "greeting.xml";

$xml_parser = xml_parser_create();
$result = xml_parse($xml_parser,$file);
xml_parser_free($xml_parser);

echo $result;


Alleen is de output altijd 1

Dat is niet goed dacht ik
Tja, dat zou ik niet weten. Maar Packetlosss gaf wel een goede tip. Regel het met DOM, dat maakt het allemaal stukken makkelijker.

Verwijderd

Voordat je er heel enthousiast mee aan de slag gaat, lees ff goed die 'waarschuwing' bovenaan de pagina..
http://www.php.net/manual/nl/ref.domxml.php

Verwijderd

Topicstarter
Dat is toch niet precies wat ik wil:

Ik vervang GET of POST door een XML request

Ik wil een PHP functie maken die:
- de XML code parsed
- het XSD schema de XML laten controleren
- True teruggeeft als XML voldoet aan XSD
- False teruggeeft als XML niet voldoet aan XSD

Het gaat me niet echt meer om het parsen maar om die check of de XML goed gevalideerd is

  • Croccifixio
  • Registratie: Maart 2002
  • Laatst online: 01-04-2025
Verwijderd schreef op 06 november 2002 @ 13:58:
Dat is toch niet precies wat ik wil:

Ik wil een PHP functie maken die:
- een XML parsed
- het XSD schema de XML laten controleren
- True teruggeeft als XML voldoet aan XSD
- False teruggeeft als XML niet voldoet aan XSD

Het gaat me niet echt meer om het parsen maar om die check of de XML goed gevalideerd is
Zo'n functie zit dus al in ASP en ik denk dus ook dat zo'n functie al in die module voor DOM zit.
Wil je geen gebruik maken van die module, maar zelf een functie daarvoor schrijven, dan kan ik verder niet helpen.

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
Function loadXMLFile(ByRef xmlObj, ByVal fileName)
    set xmlObj = Server.CreateObject("Microsoft.XMLDOM")
    xmlObj.async = false
    xmlObj.load(Server.MapPath(fileName))
    
    loadXMLFile = true
End Function
Ok als dat met deze functie zou werken in asp wat geef ik dan mee voor die parameter ByRef xmlObj (sorry ASP noob).

  • Croccifixio
  • Registratie: Maart 2002
  • Laatst online: 01-04-2025
Verwijderd schreef op 06 november 2002 @ 14:05:
[...]


Ok als dat met deze functie zou werken in asp wat geef ik dan mee voor die parameter ByRef xmlObj (sorry ASP noob).
Je moet niet in ASP gaan werken alleen omdat je hier een voorbeeld ziet hoe het kan werken. Maar ja, moet je zelf weten.

De parameter xmlObj is alleen bedoeld om een referentie te bewaren naar het gevalideerde XML object. In je ASP pagina declareer je dus een nieuwe variabele en deze geef je mee aan de functie.

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

-TheGrimReaper- schreef op 06 november 2002 @ 10:37:
[...]


Tja, dat zou ik niet weten. Maar Packetlosss gaf wel een goede tip. Regel het met DOM, dat maakt het allemaal stukken makkelijker.



XMLDOM is leuk en extreem flexibel en uitgebreid, maar dat SAX/expat gebeuren is stukken sneller, efficienter en simpeler.. Zeker voor dit soort doeleinden (simpelweg inlezen en gebruiken van data)...

Met als enige nadeel dan inderdaad dat expat niet valideert ;)
Pagina: 1