获取XSD中的元素

时间:2017-08-18 18:34:18

标签: php xml xsd

我有一个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个产品,我需要使用每个信息

3 个答案:

答案 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;
}