2017-08-18 95 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; 
}