【问题标题】:Extract XML element as a string from SQL Server XML Data Type从 SQL Server XML 数据类型中提取 XML 元素作为字符串
【发布时间】:2021-07-10 05:57:03
【问题描述】:

我想从 XML 中提取一个元素作为字符串。我使用的方法如下:

declare @xml xml = 
'<sl:stand xmlns:sl="http://www.kadaster.nl/schemas/standlevering-generiek/1.0">
    <sl-bag-extract:bagObject xmlns:sl-bag-extract="http://www.kadaster.nl/schemas/lvbag/extract-deelbestand-lvc/v20200601">
        <Objecten:Pand xmlns:Objecten="www.kadaster.nl/schemas/lvbag/imbag/objecten/v20200601">
            <Objecten:geometrie>
                <gml:Polygon srsName="urn:ogc:def:crs:EPSG::0"
                             srsDimension="3"
                             xmlns:gml="http://www.opengis.net/gml/3.2">
                    <gml:exterior>
                        <gml:LinearRing>
                            <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
                        </gml:LinearRing>
                    </gml:exterior>
                </gml:Polygon>
            </Objecten:geometrie>
        </Objecten:Pand>
    </sl-bag-extract:bagObject>
</sl:stand>
'

;WITH XMLNAMESPACES('http://www.kadaster.nl/schemas/standlevering-generiek/1.0' AS sl,
                    'http://www.kadaster.nl/schemas/lvbag/extract-deelbestand-lvc/v20200601' AS [sl-bag-extract],
                    'www.kadaster.nl/schemas/lvbag/imbag/objecten/v20200601' AS Objecten,
                                        'www.kadaster.nl/schemas/lvbag/imbag/historie/v20200601' as Historie)
SELECT
Tab.Col.value('(Objecten:geometrie)[1]','varchar(max)') AS geometrie
FROM   @xml.nodes('/sl:stand/sl-bag-extract:bagObject/Objecten:Pand') Tab(Col)

我将从这个查询中得到的结果是:

1 2 3 4 5 6 1 2

但我希望它是这样的:

            <gml:Polygon srsName="urn:ogc:def:crs:EPSG::0"
                         srsDimension="3"
                         xmlns:gml="http://www.opengis.net/gml/3.2">
                <gml:exterior>
                    <gml:LinearRing>
                        <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
                    </gml:LinearRing>
                </gml:exterior>
            </gml:Polygon>

如何从这个 XML 中提取一个元素作为字符串?

【问题讨论】:

  • Tab.Col.query('Objecten:geometrie/node()') AS 几何

标签: sql-server xml tsql


【解决方案1】:

看来你想要的是query 不是 value:

WITH XMLNAMESPACES('http://www.kadaster.nl/schemas/standlevering-generiek/1.0' AS sl,
                    'http://www.kadaster.nl/schemas/lvbag/extract-deelbestand-lvc/v20200601' AS [sl-bag-extract],
                    'www.kadaster.nl/schemas/lvbag/imbag/objecten/v20200601' AS Objecten,
                    'www.kadaster.nl/schemas/lvbag/imbag/historie/v20200601' as Historie,
                    'http://www.opengis.net/gml/3.2' AS gml) --Needed to add this Namespace
SELECT Tab.Col.query('(Objecten:geometrie/gml:Polygon)[1]') AS geometrie
FROM   @xml.nodes('/sl:stand/sl-bag-extract:bagObject/Objecten:Pand') Tab(Col); --Statement terminators terminator your statements, not start them

【讨论】:

  • 谢谢,使用查询是解决方案!因为我需要内部元素,所以我将其更改为:Tab.Col.query('(Objecten:geometrie/*)') as geometrie
【解决方案2】:

不用.nodes()方法,.query()方法就够了。

SQL

DECLARE @xml XML = 
N'<sl:stand xmlns:sl="http://www.kadaster.nl/schemas/standlevering-generiek/1.0">
    <sl-bag-extract:bagObject xmlns:sl-bag-extract="http://www.kadaster.nl/schemas/lvbag/extract-deelbestand-lvc/v20200601">
        <Objecten:Pand xmlns:Objecten="www.kadaster.nl/schemas/lvbag/imbag/objecten/v20200601">
            <Objecten:geometrie>
                <gml:Polygon srsName="urn:ogc:def:crs:EPSG::0"
                             srsDimension="3"
                             xmlns:gml="http://www.opengis.net/gml/3.2">
                    <gml:exterior>
                        <gml:LinearRing>
                            <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
                        </gml:LinearRing>
                    </gml:exterior>
                </gml:Polygon>
            </Objecten:geometrie>
        </Objecten:Pand>
    </sl-bag-extract:bagObject>
</sl:stand>';

WITH XMLNAMESPACES('http://www.kadaster.nl/schemas/standlevering-generiek/1.0' AS sl,
                    'http://www.kadaster.nl/schemas/lvbag/extract-deelbestand-lvc/v20200601' AS [sl-bag-extract],
                    'www.kadaster.nl/schemas/lvbag/imbag/objecten/v20200601' AS Objecten,
                    'http://www.opengis.net/gml/3.2' AS gml)
SELECT @xml.query('/sl:stand/sl-bag-extract:bagObject/Objecten:Pand/Objecten:geometrie/gml:Polygon') AS geometrie;

输出

<gml:Polygon xmlns:gml="http://www.opengis.net/gml/3.2"
             srsName="urn:ogc:def:crs:EPSG::0" srsDimension="3">
    <gml:exterior>
        <gml:LinearRing>
            <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
        </gml:LinearRing>
    </gml:exterior>
</gml:Polygon>

【讨论】:

    猜你喜欢
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多