2017-08-18 107 views
0

我有一個PHP代碼,它可以調用web服務並返回一個XSD,但我不知道如何閱讀它的元素。什麼是最好的方法? 我搜索了DOMDocuments,但是我並沒有很好地理解它。這是最好的方法嗎?獲取XSD中的元素

編輯 - 好的,我可以讓我的xsd到一個DOMDocument,現在我怎麼能得到,例如,節點CATEGORIA在第二個產品中的值?

這裏是它返回的代碼:

<?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> 

其在葡萄牙,但是我想你們能夠理解什麼是什麼。它返回了我約20個產品,我需要使用這些信息中的每一個

+0

的http:// PHP。 net/manual/en/domxpath.query.php – Hackerman

回答

0

解決!原來我的XSD與代碼數組下面

$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

有兩種方法可以解決這個問題,一個是DOM,另一個是SAX。 DOM需要在處理它之前讀取整個文檔, 其中SAX是基於事件的,並且只要在讀取文檔時發現您感興趣的內容就會觸發事件。

基於樹的解析器VS基於事件的解析器

請參閱此頁的快速教程: w3schools

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

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

謝謝!我已經解決了,會作爲答案發布。由於我基本上都需要所有的值,所以我使用了DOM。 – Stordon

0

我知道你已經成功地得到你想要的東西,但使用的SimpleXML和XPath正確...

<?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; 
}