2011-03-29 23 views
8

¿Cómo elimino/ignoro el espacio de nombres XML en un archivo xml al consultar los datos con T-SQL?Ignorar espacio de nombres XML en T-SQL

Estoy cargando un archivo xml en una variable, y funciona muy bien. Pero el xml tiene un conjunto de espacios de nombres, y a menos que lo elimine, mis consultas aparecerán vacías.

T-SQL:

DECLARE @xml xml 
SELECT @xml = BulkColumn FROM OPENROWSET(BULK 'C:\myfile.xml', SINGLE_BLOB) AS A 

SELECT X.z.value('ID[1]', 'VARCHAR(3)') FROM @xml.nodes('myroot/element') AS X(z) 

XML de ejemplo:

<?xml version="1.0" encoding="utf-8"?> 
<myroot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <element> 
    <ID>1</ID> 
    </element> 
    <element> 
    <ID>2</ID> 
    </element> 
    <element> 
    <ID>3</ID> 
    </element> 
</myroot> 

Esto funciona, la consulta devuelve esto:

Pero el XML también contiene un espacio de nombres por defecto:

<myroot xmlns="http://XXX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

Los xmlns="http://XXX" completamente los tornillos hasta mi consulta. Desafortunadamente, modificar manualmente el xml antes de cargarlo no es realmente una opción.

Preguntas:

  • ¿Cómo se quita o ignorar el espacio de nombres cuando la carga de los datos en la variable?
  • ¿O cómo modifico mi consulta para manejar el espacio de nombres?

Respuesta

19

Sólo tiene que utilizar esto:

;WITH XMLNAMESPACES(DEFAULT 'http://XXX') 
SELECT 
    X.z.value('ID[1]', 'VARCHAR(3)') 
FROM 
    @xml.nodes('/myroot/element') AS X(z) 

El WITH XMLNAMESPACES le permite definir aliasses de espacio de nombres para sus consultas, y si no se preocupan por un prefijo específico espacio de nombres XML, sólo puede definirlo como DEFAULT espacio de nombres y listo.

+0

Excelente, funciona perfectamente. Gracias. :) –

3

Estaba enfrentando el mismo problema en mi XML Query. Namespace "xmlns="urn:tradefeed-xsd" estaba creando un problema y mi consulta vuelve vacía.

<?xml version="1.0" encoding="UTF-8" ?> 
<BatchFeed xmlns="urn:tradefeed-xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

Una vez utilicé ;WITH XMLNAMESPACES(DEFAULT 'urn:tradefeed-xsd') declaración ante mi sentencia Select devuelve datos.

Cuestiones relacionadas