Tengo un código HTML almacenado en la base de datos y quiero leerlo como XML.
Mis códigos:
http://rextester.com/RMEHO89992
Este es un ejemplo del código HTML que tengo:
<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>
y este es un ejemplo de la salida que necesito:
Category Selection Value
--------- --------- ------------
A Ab AD
A Ag AL
B Bb BD
B Bg BL
Necesito obtener el valor dentro de la <h4>
etiqueta como a Category
, la primera <span>
etiqueta como Selección y el resto de los valores como una cadena concatenada.
He intentado la siguiente 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)
y :
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)
Pero solo obtiene la primera categoría y no obtiene todos los 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
Puede haber N categorías, y los valores pueden o no estar dentro de las <span>
etiquetas. ¿Cómo puedo obtener todas las categorías con su valor correspondiente? o obtener:
category h4 number
-------- -----------
A 1
B 2
- 1, media = h4 primero, 2, media = h4 segundo
ul number Selection Value
--------- --------- ------------
1 Ab AD
1 Ag AL
2 Bb BD
2 Bg BL
relación entre el número ul de la columna y el número h4. No puedo.
sql-server
t-sql
xml
Ejército Rojo
fuente
fuente
AD AC
para la primera fila de la tercera columna?Respuestas:
Esto no es exactamente elegante, pero parece hacer el trabajo.
Que vuelve
Supongo que esto es lo que desea, ya que la tabla de resultados deseada en la pregunta no devuelve el "resto de los valores como una cadena concatenada"
fuente
Puede usar el operador
<<
y>>
para verificar si un nodo está antes o después de otro nodo en el orden de los documentos. Combine eso con un predicado en posición,[1]
para obtener la primera aparición también en orden de documento.rextester:
<<
y>>
se llaman Operadores de comparación de orden de nodoSi tiene un fragmento XML como este:
Puede obtener todos los nodos antes de la primera aparición de
N3
con esta consulta:Resultado:
/*
le dará todos los nodos raíz. Lo que está encerrado[]
es un predicado..
es el nodo actual y/N3[1]
es el primer nodo N3 en el orden de los documentos en el nivel raíz. Entonces, de cada nodo raíz obtienes los nodos que precedenN3
.Aquí está casi la misma consulta, solo usted obtiene los nodos que siguen al primer
N3
nodo:Para obtener solo el primer nodo después del primer
N3
nodo, agregue el predicado[1]
:fuente