У меня есть HTML-код, хранящийся в базе данных, и я хочу читать его как XML.
Мои коды:
http://rextester.com/RMEHO89992
Это пример кода HTML, который у меня есть:
<div>
<section>
<h4>
<span> A </span>
</h4>
<ul>
<li>
<span> Ab</span>
AD
<span> AC </span>
</li>
<li>
<span> Ag</span>
<span> AL </span>
</li>
</ul>
<h4>
<span> B </span>
</h4>
<ul>
<li>
<span> Bb</span>
BD
<span> BC </span>
</li>
<li>
<span> Bg</span>
<span> BL </span>
</li>
</ul>
</section>
</div>
и это пример вывода мне нужно:
Category Selection Value
--------- --------- ------------
A Ab AD
A Ag AL
B Bb BD
B Bg BL
Мне нужно получить значение внутри <h4>
тега как a Category
, первый <span>
тег как Selection, а остальные значения как объединенную строку.
Я пробовал следующий запрос:
SELECT
( isnull(t.v.value('(h4/span/span[1]/text())[1]','nvarchar(max)'),'')
+ isnull(t.v.value('(h4/span/text())[1]','nvarchar(max)'),'')
+ isnull(t.v.value('(h4/span/span[2]/text())[2]','nvarchar(max)'),'')
) AS [Category],
( isnull(c.g.value('(span[1]/text())[1]','nvarchar(max)'),'')
+ isnull(c.g.value('(span[1]/span/text())[1]','nvarchar(max)'),'')
+ isnull(c.g.value('(span[1]/text())[2]','nvarchar(max)'),'')
) AS [Selection],
( isnull(c.g.value('(span[2]/text())[1]','nvarchar(max)'),'')
+ isnull(c.g.value('(span[2]/span/text())[1]','nvarchar(max)'),'')
+ isnull(c.g.value('(span[2]/text())[2]','nvarchar(max)'),'')
) AS [Value]
FROM @htmlXML.nodes('div/section') as t(v)
CROSS APPLY t.v.nodes('./ul/li') AS c(g)
и :
SELECT
t.v.value('.','nvarchar(max)')
,
--( isnull(t.v.value('(h4/span/span[1]/text())[1]','nvarchar(max)'),'')+isnull(t.v.value('(h4/span/text())[1]','nvarchar(max)'),'')+isnull(t.v.value('(h4/span/span[2]/text())[2]','nvarchar(max)'),''))AS [Category],
( isnull(c.g.value('(span[1]/text())[1]','nvarchar(max)'),'')+isnull(c.g.value('(span[1]/span/text())[1]','nvarchar(max)'),'')+isnull(c.g.value('(span[1]/text())[2]','nvarchar(max)'),''))AS [Selection]
,
( isnull(c.g.value('(span[2]/text())[1]','nvarchar(max)'),'')+isnull(c.g.value('(span[2]/span/text())[1]','nvarchar(max)'),'')+isnull(c.g.value('(span[2]/text())[2]','nvarchar(max)'),''))AS [Value]
FROM @htmlXML.nodes('div/section/h4/span') as t(v)
CROSS APPLY @htmlXML.nodes('div/section/ul/li') AS c(g)
Но он получает только первую категорию и не получает все значения вместе.
Category Selection Value
--------- --------- ------------
A Ab AC
B Ab AC
A Ag AL
B Ag AL
A Bb BC
B Bb BC
A Bg BL
B Bg BL
Может быть N категорий, и значения могут быть или не быть внутри <span>
тегов. Как я могу получить все категории с соответствующими значениями? или получите:
category h4 number
-------- -----------
A 1
B 2
- 1, среднее значение = h4 сначала, 2, среднее значение = h4 секунды
ul number Selection Value
--------- --------- ------------
1 Ab AD
1 Ag AL
2 Bb BD
2 Bg BL
связь между номером столбца ul и номером h4. я не могу.
sql-server
t-sql
xml
Красная армия
источник
источник
AD AC
для первого ряда в третьем столбце?Ответы:
Это не совсем элегантно, но, кажется, делает работу.
Который возвращается
Я предполагаю, что это то, что вы хотите, так как таблица желаемых результатов в вопросе не возвращает «остальные значения в виде объединенной строки»
источник
Вы можете использовать оператор
<<
and,>>
чтобы проверить, находится ли узел до или после другого узла в порядке документов. Объедините это с предикатом позиции,[1]
чтобы получить первое вхождение также в порядке документа.rextester:
<<
и>>
называются операторами сравнения порядка узловЕсли у вас есть такой фрагмент XML:
вы можете получить все узлы до первого появления
N3
этого запроса:Результат:
/*
даст вам все корневые узлы. Что заключено в[]
это предикат..
является текущим узлом и/N3[1]
является первым узлом N3 в порядке документа на корневом уровне. Таким образом, от каждого корневого узла вы получаете узлы, которые предшествуютN3
.Здесь почти тот же запрос, только вы получаете узлы, которые следуют за первым
N3
узлом:Чтобы получить первый узел только после первого
N3
, вы добавляете предикат[1]
:источник