Search code examples
sqlt-sqlsqlxml

How to select Text value from html document in sql?


i want to select all values of li 1 ta 3 (for example). but i cannt. my code bottom and final output in end of question.

code:

Declare @XML1 xml = N'
<div>
<div>
    <h4>انتخاب رنگ</h4>
    <ul id="frmErblProductColor" autocompelete="off">
        <li>
            <div id="frmErblProductColor_ContainerItem_0" class="DkProductColorBox">
                <input id="frmErblProductColor_RadioItem_0" type="radio" name="ctl29$frmErblProductColor$ProductColorGroup" value="1" checked="checked"/>
                <label id="frmErblProductColor_LabelItem_0" for="frmErblProductColor_RadioItem_0" data-color="#2b2b2b">مشکی</label>
            </div>
        </li>
        <li>
            <div id="frmErblProductColor_ContainerItem_1" class="DkProductColorBox">
                <input id="frmErblProductColor_RadioItem_1" type="radio" name="ctl29$frmErblProductColor$ProductColorGroup" value="4"/>
                <label id="frmErblProductColor_LabelItem_1" for="frmErblProductColor_RadioItem_1" data-color="blue">آبی</label>
            </div>
        </li>
        <li>
            <div id="frmErblProductColor_ContainerItem_2" class="DkProductColorBox">
                <input id="frmErblProductColor_RadioItem_2" type="radio" name="ctl29$frmErblProductColor$ProductColorGroup" value="16"/>
                <label id="frmErblProductColor_LabelItem_2" for="frmErblProductColor_RadioItem_2" data-color="darkred">زرشکی</label>
            </div>
        </li>
    </ul>
</div>
<div></div>
<ul></ul>
</div>';

SELECT
    t.v.value('(div[1]/h4/text())[1]','nvarchar(max)') AS [Selection]
    ,t.v.value('(ul/li/div/label/text())[1]','nvarchar(max)') AS [Value]
    ,t.v.value('(ul/li/div/input/@value)[1]','nvarchar(max)') AS [Code]
FROM
    @XML1.nodes('div/div[1]') as t(v)

SELECT  
    c.d.value('.','nvarchar(max)') AS [Selection]
    ,t.v.value('.','nvarchar(max)') AS [Value]
    ,f.j.value('@value','nvarchar(max)') AS [Code]
FROM 
    @XML1.nodes('div/div[1]/div[1]/h4') as c(d)   
    cross apply  @XML1.nodes('div/div[1]/ul/li/div/label') as t(v)
    cross apply  @XML1.nodes('div/div[1]/ul/li/div/input') as f(j)

output final must :

 [Code]             [Selection]             [Value]          
--------------       --------------     -----------
مشکی              انتخاب رنگ                     1        
زرشکی             انتخاب رنگ                    16
آبی               انتخاب رنگ                     4

Can`t now with this codes.


Solution

  • SELECT
        t.v.value('(input/@value)[1]','nvarchar(max)') AS [Code]
        ,@XML1.value('(div/div/h4/text())[1]','nvarchar(max)') AS [Selection]
        ,t.v.value('(label/text())[1]','nvarchar(max)') AS [Value]
    FROM
        @XML1.nodes('div/div/ul/li/div') as t(v)
    

    Or perhaps this is prettier:

    SELECT
        [Selection]
        ,t.v.value('(ul/li/div/label/text())[1]','nvarchar(max)') AS [Value]
        ,t.v.value('(ul/li/div/input/@value)[1]','nvarchar(max)') AS [Code]
        ,t.v.query('.')
    FROM
        @XML1.nodes('div/div[1]') as t(v)
    outer apply (select @XML1.value('(div/div/h4/text())[1]','nvarchar(max)') AS [Selection]) a