Я пытаюсь прочитать данные из KML источника файла. Часть того, что мне нужно прочитать, это информация о стиле. Различные правила стиля объявлены на корневом уровне как <Style>
узлы с различным количеством информации в них. Меня интересуют только те стили, которые определяют как цвет линии, так и цвет заливки многоугольника. Вот мой текущий подход:
Пример xml:
<Document>
<Style id="default">
</Style>
<Style id="hl">
<IconStyle>
<scale>1.2</scale>
</IconStyle>
</Style>
<Style id="White-Style">
<LineStyle>
<color>FFFFFFFF</color>
</LineStyle>
<PolyStyle>
<color>FFFFFFFF</color>
</PolyStyle>
</Style>
<Style id="Black-Style">
<LineStyle>
<color>FF000000</color>
</LineStyle>
<PolyStyle>
<color>FF000000</color>
</PolyStyle>
</Style>
<Placemark> ... </Placemark>
...
</Document>
Мой код SQL:
declare @style table( style_id nvarchar(50), line_color nchar(8), fill_color nchar(8) )
;with xmlnamespaces('http://www.opengis.net/kml/2.2'AS K)
insert into @style
select
T.A.value('(@K:id)[1]', 'nvarchar(50)'),
T.A.value('/K:LineStyle[1]/K:color[1]/.', 'nchar(8)'),
T.A.value('/K:PolyStyle[1]/K:color[1]/.', 'nchar(8)')
from @xml_data.nodes('//K:Style') as T(A)
where @xml_data.exist('//K:Style/K:PolyStyle/K:color') = 1 and @xml_data.exist('//K:Style/K:LineStyle/K:color') = 1
Проблема этого подхода заключается в том, что @xml_data, в целом , возвращает true для обоих методов exist()
, то есть метод value()
выдает ошибку при попытке извлечь правила из <Style id="default">
и <Style id="h1">
.
Я также попробовал оба следующих фрагмента:
select
...
(case T.A.exists('/K:LineStyle[1]/K:color') = 1 then T.A.value('/K:LineStyle[1]/K:color[1]/.', 'nchar(8)') else null end)
и
where T.A.exist('/K:PolyStyle[1]/K:color') = 1 and T.A.exist('/K:LineStyle[1]/K:color') = 1
Однако оба вышеперечисленных сообщения приводят к следующей ошибке: The column 'A' that was returned from the nodes() method cannot be used directly. It can only be used with one of the four XML data type methods, exist(), nodes(), query(), and value(), or in IS NULL and IS NOT NULL checks