2017-08-18 2 views
0

J'ai un code PHP qui appelle un webservice et renvoie un XSD, mais je ne sais pas comment lire ses éléments. Quel serait le meilleur moyen? J'ai cherché et j'ai fini avec DOMDocuments, mais je ne l'ai pas très bien compris. Est-ce la meilleure façon? - Ok, j'ai pu obtenir mon fichier xsd dans un DOMDocument, comment puis-je obtenir, par exemple, la valeur du noeud CATEGORIA dans le second produit?Obtenir des éléments dans XSD

Voici le code retourne:

<?xml version="1.0" encoding="utf-8"?> 
<DataSet xmlns="http://"> 
<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="Produtos"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="TIMESTAMP" type="xs:dateTime" minOccurs="0" /> 
          <xs:element name="DEPARTAMENTO" type="xs:string" minOccurs="0" /> 
          <xs:element name="CATEGORIA" type="xs:string" minOccurs="0" /> 
          <xs:element name="SUBCATEGORIA" type="xs:string" minOccurs="0" /> 
          <xs:element name="FABRICANTE" type="xs:string" minOccurs="0" /> 
          <xs:element name="CODIGO" type="xs:string" minOccurs="0" /> 
          <xs:element name="DESCRICAO" type="xs:string" minOccurs="0" /> 
          <xs:element name="DESCRTEC" type="xs:string" minOccurs="0" /> 
          <xs:element name="PARTNUMBER" type="xs:string" minOccurs="0" /> 
          <xs:element name="EAN" type="xs:string" minOccurs="0" /> 
          <xs:element name="GARANTIA" type="xs:int" minOccurs="0" /> 
          <xs:element name="PESOKG" type="xs:decimal" minOccurs="0" /> 
          <xs:element name="PRECOREVENDA" type="xs:decimal" minOccurs="0" /> 
          <xs:element name="PRECOSEMST" type="xs:decimal" minOccurs="0" /> 
          <xs:element name="DATAVALIDADEPRECO" type="xs:dateTime" minOccurs="0" /> 
          <xs:element name="DISPONIVEL" type="xs:int" minOccurs="0" /> 
          <xs:element name="URLFOTOPRODUTO" type="xs:string" minOccurs="0" /> 
          <xs:element name="ESTOQUE" type="xs:string" minOccurs="0" /> 
          <xs:element name="NCM" type="xs:string" minOccurs="0" /> 
          <xs:element name="LARGURA" type="xs:decimal" minOccurs="0" /> 
          <xs:element name="ALTURA" type="xs:decimal" minOccurs="0" /> 
          <xs:element name="PROFUNDIDADE" type="xs:decimal" minOccurs="0" /> 
          <xs:element name="ATIVO" type="xs:int" minOccurs="0" /> 
          <xs:element name="SUBSTTRIBUTARIA" type="xs:int" minOccurs="0" /> 
          <xs:element name="ORIGEMPRODUTO" type="xs:string" minOccurs="0" /> 
          <xs:element name="ESTOQUEDISPONIVEL" type="xs:decimal" minOccurs="0" /> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:choice> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
    <NewDataSet xmlns=""> 
     <Produtos diffgr:id="Produtos1" msdata:rowOrder="0"> 
       <TIMESTAMP>2017-08-11T11:09:26-03:00</TIMESTAMP> 
       <DEPARTAMENTO></DEPARTAMENTO> 
       <CATEGORIA></CATEGORIA> 
       <SUBCATEGORIA></SUBCATEGORIA> 
       <FABRICANTE>GENIUS</FABRICANTE> 
       <CODIGO>0064703</CODIGO> 
       <DESCRICAO></DESCRICAO> 
       <DESCRTEC></DESCRTEC> 
       <PARTNUMBER>31731047103</PARTNUMBER> 
       <EAN>4710268244738</EAN> 
       <GARANTIA>12</GARANTIA> 
       <PESOKG>3.1000</PESOKG> 
       <PRECOREVENDA>95.0000</PRECOREVENDA> 
       <PRECOSEMST>95.0000</PRECOSEMST> 
       <DATAVALIDADEPRECO></DATAVALIDADEPRECO> 
       <DISPONIVEL>1</DISPONIVEL> 
       <URLFOTOPRODUTO></URLFOTOPRODUTO> 
       <ESTOQUE>RJ</ESTOQUE> 
       <NCM></NCM> 
       <LARGURA>0.3000</LARGURA> 
       <ALTURA>0.3500</ALTURA> 
       <PROFUNDIDADE>0.1700</PROFUNDIDADE> 
       <ATIVO>1</ATIVO> 
       <SUBSTTRIBUTARIA>0</SUBSTTRIBUTARIA> 
       <ORIGEMPRODUTO></ORIGEMPRODUTO> 
       <ESTOQUEDISPONIVEL>63.0000</ESTOQUEDISPONIVEL> 
      </Produtos> 
      <Produtos diffgr:id="Produtos2" msdata:rowOrder="1"> 
       <TIMESTAMP>2017-08-14T18:01:00-03:00</TIMESTAMP> 
       <DEPARTAMENTO></DEPARTAMENTO> 
       <CATEGORIA></CATEGORIA> 
       <SUBCATEGORIA></SUBCATEGORIA> 
       <FABRICANTE>GENIUS</FABRICANTE> 
       <CODIGO>0064694</CODIGO> 
       <DESCRICAO></DESCRICAO> 
       <DESCRTEC></DESCRTEC> 
       <PARTNUMBER>31731006100</PARTNUMBER> 
       <EAN>4710268238461</EAN> 
       <GARANTIA>12</GARANTIA> 
       <PESOKG>0.4900</PESOKG> 
       <PRECOREVENDA>28.9900</PRECOREVENDA> 
       <PRECOSEMST>28.9900</PRECOSEMST> 
       <DATAVALIDADEPRECO></DATAVALIDADEPRECO> 
       <DISPONIVEL>1</DISPONIVEL> 
       <URLFOTOPRODUTO></URLFOTOPRODUTO> 
       <ESTOQUE>RJ</ESTOQUE> 
       <NCM>85182100   </NCM> 
       <LARGURA>0.1500</LARGURA> 
       <ALTURA>0.1200</ALTURA> 
       <PROFUNDIDADE>0.0700</PROFUNDIDADE> 
       <ATIVO>1</ATIVO> 
       <SUBSTTRIBUTARIA>0</SUBSTTRIBUTARIA> 
       <ORIGEMPRODUTO></ORIGEMPRODUTO> 
       <ESTOQUEDISPONIVEL>100.0000</ESTOQUEDISPONIVEL> 
      </Produtos> 
     </NewDataSet> 
    </diffgr:diffgram> 
</DataSet> 

Son en portugais, mais je pense que vous pouvez comprendre ce gars est quoi. Il me renvoie environ 20 produits, et j'ai besoin de faire usage de chacune de ces informations

+0

http: // php. net/manual/fr/domxpath.query.php – Hackerman

Répondre

0

Résolu !! Tourné mon XSD dans un tableau avec le code ci-dessous

$doc = new DOMDocument(); 
    $doc->preserveWhiteSpace = true; 
    $doc->loadXML($response); 
    $doc->save('t.xml'); 

    $xmlfile = file_get_contents('t.xml'); 
    $parseObj = str_replace($doc->lastChild->prefix.':',"",$xmlfile); 
    $ob  = simplexml_load_string($parseObj); 
    $data  = json_decode(json_encode($ob), true); 
0

Il ya deux façons d'aborder cela, l'un est DOM et l'autre est SAX. DOM nécessite la lecture de l'ensemble du document avant de le traiter, où SAX est basé sur un événement et les événements sont déclenchés dès qu'il trouve quelque chose qui vous intéresse lorsque le document est lu.

Tree-Based vs Parsers Parsers basé sur les événements

S'il vous plaît voir cette page pour un rapide tutoriel: w3schools

<?php 
$xmlDoc = new DOMDocument(); 
$xmlDoc->load("note.xml"); 

$x = $xmlDoc->documentElement; 
foreach ($x->childNodes AS $item) { 
    print $item->nodeName . " = " . $item->nodeValue . "<br>"; 
} 
?> 
+0

Merci !! Je l'ai déjà résolu, je vais poster comme réponse. Comme j'ai besoin de toutes les valeurs, j'ai utilisé DOM. – Stordon

0

Je sais que vous avez réussi à obtenir ce que vous voulez, mais d'utiliser SimpleXML et XPath correctement ...

<?php 
error_reporting (E_ALL); 
ini_set ('display_errors', 1); 

$xsd = simplexml_load_file("t1.xml"); 
$xsd->registerXPathNamespace("xs", "http://www.w3.org/2001/XMLSchema"); 
$elements = $xsd->xpath("//xs:element[@minOccurs]"); 
foreach ($elements as $element) { 
    echo "Element name: ".$element['name'].PHP_EOL; 
}