Procurar dentro do objeto

Bom dia!!

Usei a função XmlParserFile para ler um XML e jogar dentro de uma variável, oXML, ok... Ele monta a estrutura certinha, conforme a cadeia das TAGs, mas as vezes o XML tem determinadas TAGs e as vezes não, dai se não tem e eu mando ler, da erro. Por exemplo, a estrutura fica: nSeg := oXml:_NFE:_INFNFE:_DET:_PROD:_VSEG:TEXT Mas se dentro do PROD não existir a tag VSEG, ele da erro. Existe uma forma de eu consultar antes se nessa "cadeia" do oXML vai ter o VSEG ou não? Dai se tiver eu jogo na variável, se não passo um 0 por exemplo. Não encontrei nada....

Obrigado!!

Guilherme,

Você pode usar a função AttIsMemberOf para verificar se o objeto do XML tem ou não o valor.

Abaixo um exemplo do uso:


//------------------------------------------------------------------
/*/{Protheus.doc} u_xmlProperty
Verificação de propriedades em XML

@author Daniel Mendes
@since 30/03/2022
@version 1.0
/*/
//-------------------------------------------------------------------
function u_xmlProperty()
local cXml as character
local oXml as object
local cWarning as character
local cError as character

begincontent var cXml
<?xml version="1.0" encoding="ISO-8859-1"?>
<pedido>
    <Nome_Cliente>Microsiga Software</Nome_Cliente>
    <Endereco>Av. Braz Leme</Endereco>
    <Numero>1361</Numero>
    <Data>22-03-2005</Data>
    <Itens>
        <Item>
            <Produto>Protheus</Produto>
            <Quantidade>1</Quantidade>
            <Preco>100.00</Preco>
        </Item>
    </Itens>
</pedido>
endcontent

cWarning := ""
cError := ""

oXml := XmlParser(cXml, "_", @cError, @cWarning)

if AttIsMemberOf(oXml, "_pedido") .and. AttIsMemberOf(oXml:_pedido, "_numero")
    conOut(oXml:_pedido:_numero:text)
endif

FreeObj(oXml)

oXml := nil

return

Documentação:

https://tdn.totvs.com.br/display/tec/XmlParser

https://tdn.totvs.com.br/display/tec/AttlsMemberOf

Perfeito!! Era isso mesmo que eu precisava. Muito obrigado!