我有一个PHP代码,它调用webservice并返回一个XSD,但我不知道如何读取它的元素。什么是最好的方式? 我已经搜索过并最终得到了DOMDocuments,但我并不理解它。这是最好的方式吗?
编辑 - 好的,我能够将我的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 :(得分:0)
有两种方法可以解决这个问题,一种是DOM,另一种是SAX。 DOM需要在处理之前读取整个文档, SAX是基于事件的,当事件在找到您感兴趣的内容时会被触发,因为文档被读取。
基于树的解析器与基于事件的解析器
请参阅此页面以获取快速教程: w3schools
<?php
$xmlDoc = new DOMDocument();
$xmlDoc->load("note.xml");
$x = $xmlDoc->documentElement;
foreach ($x->childNodes AS $item) {
print $item->nodeName . " = " . $item->nodeValue . "<br>";
}
?>
答案 1 :(得分: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);
答案 2 :(得分: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;
}