如何在文本包含xml名称空间时将文本转换为XML?

时间:2017-10-26 13:40:43

标签: sql-server xml tsql

试图在这里说出一个不同的问题...如何查询下面的xml,我发现我无法将其成功转换为XML来提出问题。

以下是我的尝试

;WITH CTE AS
( SELECT CONVERT(XML,N'
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2' xmlns:gx='http://www.google.com/kml/ext/2.2'>
    <Document>
        <Placemark>
            <open>1</open>
            <gx:Track>
                <altitudeMode>clampToGround</altitudeMode>
                <when>2017-10-26T11:42:05Z</when>
                <gx:coord>Lat Long Altitude</gx:coord>
                <when>2017-10-26T11:41:40Z</when>
                <gx:coord>Lat Long Altitude</gx:coord>
            </gx:Track>
        </Placemark>
    </Document>
</kml>'
        ) AS BulkColumnXML
)
SELECT *
FROM CTE

错误是:

  

Msg 9438,Level 16,State 1,Line 16

     

XML解析:第2行,第6个字符,text / xmldecl不在输入的开头

我不确定我做错了什么,如果删除名称空间声明,转换就可以了。

正确代码:

;WITH CTE AS
( SELECT CONVERT(XML,'<?xml version=''1.0'' encoding=''UTF-8''?>
<kml xmlns=''http://www.opengis.net/kml/2.2'' xmlns:gx=''http://www.google.com/kml/ext/2.2''>
    <Document>
        <Placemark>
            <open>1</open>
            <gx:Track>
                <altitudeMode>clampToGround</altitudeMode>
                <when>2017-10-26T11:42:05Z</when>
                <gx:coord>Lat Long Altitude</gx:coord>
                <when>2017-10-26T11:41:40Z</when>
                <gx:coord>Lat Long Altitude</gx:coord>
            </gx:Track>
        </Placemark>
    </Document>
</kml>'
        ) AS BulkColumnXML
)
SELECT *
FROM CTE

1 个答案:

答案 0 :(得分:2)

看起来你的XML prolog之前有空格。按如下方式重新格式化CTE:

;WITH CTE AS
( SELECT CONVERT(XML, 
N'<?xml version="1.0" encoding="UTF-8"?>
           . . . 

普通XML在根元素之前可以有空格,但在XML Prolog之前必须没有数据。