Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

comment parcourrir un xml avec DOM?

2 réponses
Avatar
TTT
Bonjour,

J'essaie de parcourrir un fichier XML qui décrit une base de données
relationnelle (juste la structure). Ce fichier a été produit par VS.NET.
Comment faire avec l'implémentation DOM de PHP5? Les docs sont assez
incomplètes là dessus.

Voilà comment j'ai commencé :
$dom = new domDocument();
$dom->load("schema.xsd");
$doc = $dom->documentElement;
$nodes = $doc->getElementsByTagName("complexType");

Ici $nodes me donne TOUS les neouds de tag <complexType>. Il met donc "à
plat" le fichier XML et je perds la structure du fichier. Comment faut-il
parcourrir récursivement un tel fichier XML? Comment lire la définition des
tables "client" et "country" ?

Merci.

Voici le fichier XML joint : (pour ceux qui connaissent VS.NET C#, il s'agit
d'un DataSet.GetXmlSchema())

<?xml version="1.0" encoding="utf-16" ?>
<xs:schema id="ds" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="ds" msdata:IsDataSet="true" msdata:Locale="fr-FR">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="client">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:string" />
<xs:element name="name" type="xs:string" minOccurs="0" />
<xs:element name="country" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="country">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:string" />
<xs:element name="name" type="xs:string" minOccurs="0" />
<xs:element name="code" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:unique name="pkclient" msdata:PrimaryKey="true">
<xs:selector xpath=".//client" />
<xs:field xpath="id" />
</xs:unique>
<xs:unique name="pkcountry" msdata:PrimaryKey="true">
<xs:selector xpath=".//country" />
<xs:field xpath="id" />
</xs:unique>
<xs:keyref name="rel_cc" refer="pkcountry">
<xs:selector xpath=".//client" />
<xs:field xpath="country" />
</xs:keyref>
</xs:element>
</xs:schema>

2 réponses

Avatar
loufoque
TTT a dit le 07/11/2004 18:26:

Comment faire avec l'implémentation DOM de PHP5? Les docs sont assez
incomplètes là dessus.


La documentation est déjà disponible sur le site w3.org.
Elle est on ne peut plus précise.

Ici $nodes me donne TOUS les neouds de tag <complexType>.


Normal, comme son nom l'indique, getElementsByTagName() retourne tous
les éléments dans le nom est celui indiqué.

Il met donc "à
plat" le fichier XML et je perds la structure du fichier.


Je ne comprends pas.

Sinon, pour trouver rapidement des données précises, mieux vaut utiliser
une addresse XPath (qui renvoit une liste de noeuds).

Avatar
nospam
TTT wrote:


J'essaie de parcourrir un fichier XML qui décrit une base de données
relationnelle (juste la structure). Ce fichier a été produit par VS.NET.
Comment faire avec l'implémentation DOM de PHP5? Les docs sont assez
incomplètes là dessus.

Voilà comment j'ai commencé :
$dom = new domDocument();
$dom->load("schema.xsd");
$doc = $dom->documentElement;
$nodes = $doc->getElementsByTagName("complexType");


Je ne sais pas exactement ce que tu veux faire mais dans ton cas tu peux
faire un $doc->getElementById("ds") (ton exemple doit marcher aussi),
et parcourir ensuite l'arbre avec les fonctions du DOM documentées sur
le site du w3c [1].

Par exemple:
$elements = $doc->getElementsByTagName("complexType");

<?php
foreach ($elements as $element) {
$sequence = $element->firstChild;

$id = $sequence->getElementsByTagName("id")[0];
$name = $sequence->getElementsByTagName("name")[0];
$country = $sequence->getElementsByTagName("country")[0];
//...
}
?>

Attention ici je suppose que l'arbre est bien structuré ;-)


Pour entrer dans un element: $node = $parentnode->firstChild, pour
parcourir les suivants du même niveau: while ( $node $node->nextSibling ) {}

Attention je précise que
1/ Je suis (beaucoup) plus habitué à utiliser le DOM en Javascript
(d'ailleurs la doc de mon lien est celle de l'ECMAScript)
2/ Je n'ai pas testé mes exemples :p

[1]:
<http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/ecma-script-bin
ding.html>
--
Romuald Brunet, ICQ 33033393, http://mog.online.fr

Remplacez nospam par mon prénom pour me contacter par email