IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[SimpleXML] Ajout de noeuds et namespaces


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 32
    Par défaut [SimpleXML] Ajout de noeuds et namespaces
    Bonjour,

    Voila, je travaille sur un fichier xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    <?xml version="1.0" encoding="utf-8"?>
    	<DataSet>
    		<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    			<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    				<xs:complexType>
    					<xs:choice minOccurs="0" maxOccurs="unbounded">
    						<xs:element name="xml">
    							<xs:complexType>
    								<xs:sequence>
    									<xs:element name="Id" msdata:AutoIncrement="true" type="xs:int" />
    									<xs:element name="Nom" minOccurs="0">
    										<xs:simpleType>
    											<xs:restriction base="xs:string">
    												<xs:maxLength value="7" />
    											</xs:restriction>
    										</xs:simpleType>
    									</xs:element>
    									<xs:element name="Prenom" minOccurs="0">
    										<xs:simpleType>
    											<xs:restriction base="xs:string">
    												<xs:maxLength value="8" />
    											</xs:restriction>
    										</xs:simpleType>
    									</xs:element>
    									<xs:element name="Rue" minOccurs="0">
    										<xs:simpleType>
    											<xs:restriction base="xs:string">
    												<xs:maxLength value="10" />
    											</xs:restriction>
    										</xs:simpleType>
    									</xs:element>
    									<xs:element name="Nbr" type="xs:int" minOccurs="0"/>
    								</xs:sequence>
    							</xs:complexType>
    						</xs:element>
    					</xs:choice>
    				</xs:complexType>
    				<xs:unique name="Constraint1" msdata:PrimaryKey="true">
    					<xs:selector xpath=".//xml" />
    					<xs:field xpath="Id" />
    				</xs:unique>
    			</xs:element>
    		</xs:schema>
    		<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" />
    	</DataSet>
    J'utilise pour ce faire SipleXml, et je voudrais ajouter un(des) noeuds.
    Pour l'instant j'ai ceci comme code php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $xmlDataSet = simplexml_load_string($string);
    $NewDataSet = $xmlDataSet->addChild('NewDataSet');
    openDb();
    $result = mysql_query("select * from xml") or die;
    while ($row = mysql_fetch_assoc($result)) {
    	$tableRow = $NewDataSet->addChild(xml);
    	$i=0;
    	while ($i < mysql_num_fields($result)) {
    		$meta = mysql_fetch_field($result, $i);
    		$tableRow->addChild($meta->name,$row[$meta->name]);
    		$i++;
    	}
    }
    Bien entendu, si je pose la question c'est que le resultat ne me satisfait pas
    Mon fichier Xml devient ceci,
    je passe tout le debut du code Xml pour faire court

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    <?xml version="1.0" encoding="utf-8"?>
    <DataSet>
    /*............*/
    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"/>
    	<NewDataSet>
    		<xml>
    			<Id>1</Id>
    			<Nom>Mon Nom</Nom>
    			<Prenom>Mon Prenom</Prenom>
    			<Rue>Ma Rue</Rue>
    			<Nbr>Mon Num</Nbr>
    		</xml>
    		<xml>
    			<Id>2</Id>
    			<Nom>Son Mon</Nom>
    			<Prenom>Son Prenom</Prenom>
    			<Rue>Sa Rue</Rue>
    			<Nbr>Son Num</Nbr>
    		</xml>
    	</NewDataSet>
    </DataSet>
    Et en fait mon fichier devrais ressembler a ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    <?xml version="1.0" encoding="utf-8"?>
    <DataSet>
    /*............*/
    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    	<NewDataSet>
    		<xml diffgr:id="xml1" msdata:rowOrder="0">
    			<Id>1</Id>
    			<Nom>Mon Nom</Nom>
    			<Prenom>Mon Prenom</Prenom>
    			<Rue>Ma Rue</Rue>
    			<Nbr>Mon Num</Nbr>
    		</xml>
    		<xml diffgr:id="xml2" msdata:rowOrder="1">
    			<Id>2</Id>
    			<Nom>Son Mon</Nom>
    			<Prenom>Son Prenom</Prenom>
    			<Rue>Sa Rue</Rue>
    			<Nbr>Son Num</Nbr>
    		</xml>
    	</NewDataSet>
    </diffgr:diffgram>
    </DataSet>
    On peut donc observer qu'il manque,dans chaque noeud "<xml>", la reference au NameSpace, de meme que la balise fermante de la declaration du NameSpace.
    je me doute bien que c'est dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tableRow->addChild($meta->name,$row[$meta->name]);
    qu'il faut y faire reference mais, voila ma question ,comment faire ?

    PS : certains auront remarques qu'il s'agit d'un DataSet VisualC# serialisé

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 32
    Par défaut
    Bon, j'avance a pas de fourmil ....

    je suis arrivé a mettre mes attributs en place,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    openDb();
    	$result = mysql_query("select * from ".$tableName) or die;
    	$j = 0;
    	while ($row = mysql_fetch_assoc($result)) {
    		$tableRow = $NewDataSet->addChild($tableName);
    		$tableRow->addAttribute('msdata:rowOrder',$j++); //-----> ici
    		$tableRow->addAttribute('diffgr:id', $tableName.$j);//----->et la
    		$i=0;
    		while ($i < mysql_num_fields($result)) {
    			$meta = mysql_fetch_field($result, $i);
    			$tableRow->addChild($meta->name,$row[$meta->name]);
    			$i++;
    		}
    	}
    cela ne me met toujours pas les references au NameSpace, si je fais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		$tableRow->addAttribute('rowOrder',$j++,'msdata');
    		$tableRow->addAttribute('id', $tableName.$j,'diffgr');
    ca donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xml xmlns="msdata" rowOrder="0" id="xml1">
    personne n'a d'idée ??

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 32
    Par défaut
    Coucou,

    Je viens faire part de mes pas de fourmils

    j'ai enfin trouvé comment faire reference a mon namespace....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	$tableRow->addAttribute('msdata:rowOrder',$j++,'urn:schemas-microsoft-com:xml-msdata');
    $tableRow->addAttribute('diffgr:id',$tableName.$j,'urn:schemas-microsoft-com:xml-diffgram-v1');
    ca donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xml xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" msdata:rowOrder="0" diffgr:id="xml1">
    mais la y'a un truc qui cloche encore ...j'ai pas besoin d'une declaration xmlns dans mon noeud

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 32
    Par défaut
    Cherchez plus j'ai trouvé



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    function simplexml_append(SimpleXMLElement $parent, SimpleXMLElement $new_child){
       $node1 = dom_import_simplexml($parent);
       $dom_sxe = dom_import_simplexml($new_child);
       $node2 = $node1->ownerDocument->importNode($dom_sxe, true);
       $node1->appendChild($node2);
    }
     
    function _FillDataSet($serialisedDataSet,$tableName,$condition) {
    	$xmlDataSet = simplexml_load_string(trim($serialisedDataSet, " ?."));
    	$xmlDataSet->registerXPathNamespace('diffgr', 'urn:schemas-microsoft-com:xml-diffgram-v1');
    	$diffgr = $xmlDataSet->xpath('//diffgr:diffgram');
     
     
    	$NewDataSet = new SimpleXMLElement('<NewDataSet></NewDataSet>');
     
     
    	//$NewDataSet = $xmlDataSet->addChild('NewDataSet');
    	openDb();
    	$result = mysql_query("select * from ".$tableName) or die;
    	$j = 0;
    	while ($row = mysql_fetch_assoc($result)) {
    		$tableRow = $NewDataSet->addChild($tableName);
    		$tableRow->addAttribute('msdata:rowOrder',$j++,'urn:schemas-microsoft-com:xml-msdata');
    		$tableRow->addAttribute('diffgr:id', $tableName.$j,'urn:schemas-microsoft-com:xml-diffgram-v1');
    		$i=0;
    		while ($i < mysql_num_fields($result)) {
    			$meta = mysql_fetch_field($result, $i);
    			$tableRow->addChild($meta->name,$row[$meta->name]);
    			$i++;
    		}
    	}
     
    	simplexml_append($diffgr[0],$NewDataSet);
     
     
    	return $xmlDataSet->asXML();
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SimpleXML] Ajouter un noeud avec addchild en premier
    Par Nillak dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 11/05/2008, 01h09
  2. [DOM] PHP5 et XML comment ajouter un noeud dans un noeud précis?
    Par titou250 dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 20/04/2006, 22h02
  3. [DOM] Ajout de noeuds
    Par zevince dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 15/03/2006, 14h39
  4. Pb d'Ajout un noeud fils dans une arborescence
    Par oramine dans le forum Oracle
    Réponses: 5
    Dernier message: 21/12/2004, 16h39
  5. [DOM] Probleme d'ajout de noeud
    Par romain3395 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 30/11/2004, 14h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo