Categorias:

Funções de dados semiestruturados e estruturados (Análise)

PARSE_XML

Interpreta uma cadeia de caracteres de entrada como um documento XML, produzindo um valor OBJECT. Se a entrada for NULL, a saída será NULL.

Consulte também:

CHECK_XML, TO_XML, XMLGET

Sintaxe

PARSE_XML( <string_containing_xml> [ , <disable_auto_convert> ] )
Copy
PARSE_XML( STR => <string_containing_xml>
  [ , DISABLE_AUTO_CONVERT => <disable_auto_convert> ] )
Copy

Argumentos

Obrigatório:

string_containing_xml . OR . STR => string_containing_xml

Especifique uma expressão que seja avaliada como um valor VARCHAR que contenha XML válido.

Opcional:

disable_auto_convert . OR . DISABLE_AUTO_CONVERT => disable_auto_convert

Uma expressão booliana que especifica se a função deve ou não tentar converter valores numéricos e boolianos em string_containing_xml para tipos de dados do Snowflake. (Para obter mais detalhes sobre essa conversão, consulte as Notas de uso abaixo).

  • Se você não quiser que a função converta esses valores, defina esse argumento como TRUE. Essa configuração tem um efeito semelhante ao do parâmetro DISABLE_AUTO_CONVERT em CREATE FILE FORMAT.

  • Se você quiser que a função converta esses valores, defina esse argumento como FALSE ou omita-o.

Padrão: FALSE

Retornos

O tipo de dados do valor retornado é OBJECT. O OBJECT contém uma representação interna do XML.

Notas de uso

  • Você deve especificar todos os argumentos por nome ou por posição. Você não pode especificar alguns dos argumentos por nome e outros argumentos por posição.

    Ao especificar um argumento por nome, você não pode usar aspas duplas no nome do argumento.

  • O conteúdo de cada elemento dos documentos XML é texto. PARSE_XML tenta converter alguns dados XML de texto em nativo (Snowflake SQL). Para obter mais informações, consulte Referência dos tipos de dados SQL.

    • NUMERIC e BOOLEAN:

      PARSE_XML tenta converter valores obviamente numéricos e boolianos em representação nativa, de modo que a impressão destes valores de volta produza resultados textualmente idênticos. Por exemplo, ao analisar números decimais, PARSE_XML tenta preservar a exatidão da representação ao tratar 123,45 como NUMBER(5,2), e não como DOUBLE. No entanto:

      • Números em notação científica (isto é, 1.2345e+02) ou números que não podem ser armazenados como casas decimais de pontos fixos devido a limitações de faixa ou escala são armazenados como DOUBLE.

      • Se o conteúdo de um elemento XML for um número com dígitos após o ponto decimal, então PARSE_XML poderá truncar os zeros no final.

      Se você não quiser que a função realize esta conversão, passe TRUE para o argumento disable_auto_convert.

    • TIMESTAMP, DATE, TIME, BINARY:

      Como o XML não representa valores como TIMESTAMP, DATE, TIME ou BINARY nativamente, eles precisam ser representados como cadeias de caracteres em XML. PARSE_XML não reconhece automaticamente esses valores. Eles são mantidos como cadeia de caracteres, portanto, converta os valores de cadeias de caracteres para tipos de dados nativos do SQL, se necessário.

  • Atributos XML são uma coleção desordenada de pares nome/valor. A função PARSE_XML não necessariamente preserva a ordem. Por exemplo, a conversão de texto para XML e de volta ao texto pode resultar em uma cadeia de caracteres que contém as informações originais em uma ordem diferente.

  • Você pode ver mudanças no espaço em branco entre os elementos ao converter de cadeia de caracteres para XML.

  • Quando PARSE_XML é usado para inserir valores numéricos em uma coluna VARIANT que são uma mistura de números inteiros (por exemplo, INT ou INTEGER) e valores em notação decimal (por exemplo, NUMBER ou FLOAT), a função pode adicionar zeros finais aos valores.

    O exemplo a seguir usa o PARSE_XML para inserir uma combinação de valores inteiros e valores em notação decimal em uma coluna VARIANT:

    CREATE OR REPLACE TABLE test_xml_table(xmlcol VARIANT);
    
    INSERT INTO test_xml_table (
      SELECT PARSE_XML($1) FROM VALUES
        ('<c>3.1</c>'),
        ('<e>2</e>'),
        ('<b>0.123</b>'));
    
    Copy

    Consultar a tabela:

    SELECT * FROM test_xml_table;
    
    Copy
    +--------------+
    | XMLCOL       |
    |--------------|
    | <c>3.100</c> |
    | <e>2.000</e> |
    | <b>0.123</b> |
    +--------------+
    

    A saída mostra que os zeros finais foram adicionados aos valores nas duas primeiras linhas.

Exemplos

O exemplo a seguir demonstra como usar a função PARSE_XML para converter uma cadeia de caracteres de XML para um OBJECT que pode ser inserido em uma coluna OBJECT:

CREATE OR REPLACE TABLE xtab (v OBJECT);

INSERT INTO xtab SELECT PARSE_XML(column1) AS v
  FROM VALUES ('<a/>'), ('<a attr="123">text</a>'), ('<a><b>X</b><b>Y</b></a>');

SELECT * FROM xtab;
Copy
+------------------------+
| V                      |
|------------------------|
| <a></a>                |
| <a attr="123">text</a> |
| <a>                    |
|   <b>X</b>             |
|   <b>Y</b>             |
| </a>                   |
+------------------------+

O exemplo a seguir demonstra as diferenças entre usar e desativar a conversão de valores numéricos. Neste exemplo, quando a conversão não está desativada, a função interpreta um número em notação científica como DOUBLE.

SELECT PARSE_XML('<test>22257e111</test>'), PARSE_XML('<test>22257e111</test>', TRUE);
Copy
+-------------------------------------+-------------------------------------------+
| PARSE_XML('<TEST>22257E111</TEST>') | PARSE_XML('<TEST>22257E111</TEST>', TRUE) |
|-------------------------------------+-------------------------------------------|
| <test>2.225700000000000e+115</test> | <test>22257e111</test>                    |
+-------------------------------------+-------------------------------------------+

O exemplo a seguir demonstra como especificar os argumentos para a função por nome:

SELECT PARSE_XML(STR => '<test>22257e111</test>', DISABLE_AUTO_CONVERT => TRUE);
Copy
+--------------------------------------------------------------------------+
| PARSE_XML(STR => '<TEST>22257E111</TEST>', DISABLE_AUTO_CONVERT => TRUE) |
|--------------------------------------------------------------------------|
| <test>22257e111</test>                                                   |
+--------------------------------------------------------------------------+