Eu tenho código HTML armazenado no banco de dados e quero lê-lo como XML.
Meus códigos:
http://rextester.com/RMEHO89992
Este é um exemplo do código HTML que tenho:
<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>
e este é um exemplo da saída que eu preciso:
Category Selection Value
--------- --------- ------------
A Ab AD
A Ag AL
B Bb BD
B Bg BL
Preciso obter o valor dentro da <h4>
tag como a Category
, a primeira <span>
tag como Selection e o restante dos valores como uma string concatenada.
Eu tentei a seguinte consulta:
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)
e :
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)
Mas só obtém a primeira categoria e não obtém todos os valores juntos.
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
Pode haver N categorias e os valores podem ou não estar dentro das <span>
tags. Como posso obter todas as categorias com o valor correspondente? ou obtenha:
category h4 number
-------- -----------
A 1
B 2
- 1, média = h4 primeiro, 2, média = h4 segundo
ul number Selection Value
--------- --------- ------------
1 Ab AD
1 Ag AL
2 Bb BD
2 Bg BL
relação entre o número ul da coluna e o número h4. eu não posso.
sql-server
t-sql
xml
Exército Vermelho
fonte
fonte
AD AC
para a primeira linha da terceira coluna?Respostas:
Isso não é exatamente elegante, mas parece fazer o trabalho.
Que retorna
Estou assumindo que é isso que você deseja, pois a tabela de resultados desejados na pergunta não retorna o "restante dos valores como uma seqüência concatenada"
fonte
Você pode usar o operador
<<
e>>
para verificar se um nó está antes ou depois de outro nó na ordem dos documentos. Combine isso com um predicado na posição,,[1]
para obter a primeira ocorrência também na ordem dos documentos.rextester:
<<
e>>
são chamados de operadores de comparação de ordem de nóSe você possui um fragmento XML como este:
você pode obter todos os nós antes da primeira ocorrência
N3
dessa consulta:Resultado:
/*
lhe dará todos os nós raiz. O que está incluído[]
é um predicado..
é o nó atual e/N3[1]
é o primeiro nó N3 em ordem de documento no nível raiz. Portanto, a partir de cada nó raiz, você obtém os nós que precedemN3
.Aqui está quase a mesma consulta, apenas você obtém os nós que seguem o primeiro
N3
nó:Para obter apenas o primeiro nó após o primeiro
N3
, adicione o predicado[1]
:fonte