【问题标题】:MSSQL XML value returns no resultMSSQL XML 值不返回结果
【发布时间】:2014-08-15 11:04:37
【问题描述】:

我正在使用 SQL Server 2008 R2 来解析 XML,但它没有返回任何结果:

<?xml version="1.0" encoding="UTF-8"?>
<ymaps xmlns="http://maps.yandex.ru/ymaps/1.x" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="     http://maps.yandex.ru/business/1.x http://maps.yandex.ru/schemas/business/1.x/business.xsd     http://maps.yandex.ru/geocoder/1.x http://maps.yandex.ru/schemas/geocoder/1.x/geocoder.xsd     http://maps.yandex.ru/psearch/1.x http://maps.yandex.ru/schemas/psearch/1.x/psearch.xsd     http://maps.yandex.ru/search/1.x http://maps.yandex.ru/schemas/search/1.x/search.xsd     http://maps.yandex.ru/web/1.x http://maps.yandex.ru/schemas/web/1.x/web.xsd     http://maps.yandex.ru/search/internal/1.x ../../search/internal/1.x/internal.xsd">
   <Attribution xmlns="http://maps.yandex.ru/attribution/1.x" />
   <GeoObjectCollection>
      <featureMember xmlns="http://www.opengis.net/gml">
         <GeoObject xmlns="http://maps.yandex.ru/ymaps/1.x">
            <Point xmlns="http://www.opengis.net/gml">
               <pos>47.248887 56.143900</pos>
            </Point>
         </GeoObject>
      </featureMember>
   </GeoObjectCollection>
</ymaps>

代码:

SELECT @XML.value('(/ymaps/GeoObjectCollection/featureMember/GeoObject/Point/pos) [1]', 'varchar(255)')

还有其他好的方法吗?谢谢。

【问题讨论】:

    标签: sql-server xml sql-server-2008-r2 xquery


    【解决方案1】:

    您在不同级别的 XML 中声明了两个不同的默认命名空间。请注意,给定一个默认命名空间,声明默认命名空间的元素及其所有没有前缀和不同默认命名空间的后代都被认为在同一个命名空间内。

    您可以使用;WITH XMLNAMESPACES()注册默认命名空间和命名空间前缀:

    ;WITH XMLNAMESPACES ('http://www.opengis.net/gml' as ns,
                         DEFAULT 'http://maps.yandex.ru/ymaps/1.x')
    SELECT @XML.value('(/ymaps/GeoObjectCollection/ns:featureMember/GeoObject/ns:Point/ns:pos) [1]', 'varchar(255)')
    

    SQL Fiddle

    【讨论】:

    • 谢谢!这正是我想要的!
    【解决方案2】:

    你有两个可能的问题:

    1) 您缺少 XPath 表达式中的命名空间,因此它不会匹配。

    2) 表达式和谓词之间有一个空格。

    试试吧:

    SELECT @XML.value('(/*:ymaps/*:GeoObjectCollection/*:featureMember/*:GeoObject/*:Point/*:pos)[1]', 'varchar(255)')
    

    我不知道如何在 MSSQL XML 中轻松管理命名空间,所以我使用了 *,这意味着 任何命名空间

    【讨论】:

      猜你喜欢
      • 2017-12-09
      • 2018-08-30
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      相关资源
      最近更新 更多