Как получить данные из HTML в столбце SQL Server - PullRequest
0 голосов
/ 12 января 2012

У меня есть некоторое содержание HTML в столбце SQL Server, я хочу прочитать содержимое из HTML.

Например:

<ektdesignns_choices ektdesignns_nodetype="element" title="How many gigs do you play each month?" ektdesignns_caption="How many gigs do you play each month?" name="ektpoll1303074024421" ektdesignns_name="ektpoll1303074024421" id="ektpoll1303074024421">
  <ol contenteditable="false" onkeypress="design_validate_choice(1, -1, this, 'Options are required.')" onclick="design_validate_choice(1, -1, this, 'Options are required.')" onblur="design_validate_choice(1, -1, this, 'Options are required.')" ektdesignns_validation="choice-req" ektdesignns_maxoccurs="1" ektdesignns_minoccurs="1" unselectable="on" title="How many gigs do you play each month?" class="design_list_vertical">
    <li>
      <input type="radio" ektdesignns_nodetype="item" name="ektpoll1303074024421" value="1 or fewer_1" title="1 or fewer" id="ID2504263" />
      <label contenteditable="true" unselectable="off" for="ID2504263">1 or fewer</label>
    </li>
    <li>
       <input type="radio" ektdesignns_nodetype="item" name="ektpoll1303074024421" value="2-4_2" title="2-4" id="ID5115606" />
       <label contenteditable="true" unselectable="off" for="ID5115606">2-4</label>
    </li>
    <li>
        <input type="radio" ektdesignns_nodetype="item" name="ektpoll1303074024421" value="5-7_3" title="5-7" id="ID477116" />
        <label contenteditable="true" unselectable="off" for="ID477116">5-7</label>
    </li>
    <li>
        <input type="radio" ektdesignns_nodetype="item" name="ektpoll1303074024421" value="8 or more_4" title="8 or more" id="ID5515606" />
        <label contenteditable="true" unselectable="off" for="ID5515606">8 or more</label>
    </li>
  </ol>
</ektdesignns_choices><input type="submit" value="Vote" />

Я хочу прочитать все ярлыки в этом html. У кого-нибудь есть идеи, как мне это сделать?

Ответы [ 4 ]

1 голос
/ 12 января 2012

Если ваш HTML действительно XHTML-совместимый, и если у вас есть HTML, хранящийся в столбце XML в вашей таблице SQL Server, то вы можете извлечь свои метки из него в T-SQL, используя XQuery:

DECLARE @HtmlTbl TABLE (ID INT IDENTITY, Html XML)

INSERT INTO @HtmlTbl(Html) VALUES('<ektdesignns_choices ektdesignns_nodetype="element" title="How many gigs do you play each month?" ektdesignns_caption="How many gigs do you play each month?" name="ektpoll1303074024421" ektdesignns_name="ektpoll1303074024421" id="ektpoll1303074024421">
  <ol contenteditable="false" onkeypress="design_validate_choice(1, -1, this, ''Options are required.'')" onclick="design_validate_choice(1, -1, this, ''Options are required.'')" onblur="design_validate_choice(1, -1, this, ''Options are required.'')" ektdesignns_validation="choice-req" ektdesignns_maxoccurs="1" ektdesignns_minoccurs="1" unselectable="on" title="How many gigs do you play each month?" class="design_list_vertical">
    <li>
      <input type="radio" ektdesignns_nodetype="item" name="ektpoll1303074024421" value="1 or fewer_1" title="1 or fewer" id="ID2504263" />
      <label contenteditable="true" unselectable="off" for="ID2504263">1 or fewer</label>
    </li>
    <li>
       <input type="radio" ektdesignns_nodetype="item" name="ektpoll1303074024421" value="2-4_2" title="2-4" id="ID5115606" />
       <label contenteditable="true" unselectable="off" for="ID5115606">2-4</label>
    </li>
    <li>
        <input type="radio" ektdesignns_nodetype="item" name="ektpoll1303074024421" value="5-7_3" title="5-7" id="ID477116" />
        <label contenteditable="true" unselectable="off" for="ID477116">5-7</label>
    </li>
    <li>
        <input type="radio" ektdesignns_nodetype="item" name="ektpoll1303074024421" value="8 or more_4" title="8 or more" id="ID5515606" />
        <label contenteditable="true" unselectable="off" for="ID5515606">8 or more</label>
    </li>
  </ol></ektdesignns_choices><input type="submit" value="Vote" />')

При этом все элементы <label> будут извлечены из вашего (X) HTML-файла в виде одной строки XML:

SELECT
    Html.query('//label')
FROM @HtmlTbl 
WHERE ID = 1

Выход:

<label contenteditable="true" unselectable="off" for="ID2504263">1 or fewer</label>
<label contenteditable="true" unselectable="off" for="ID5115606">2-4</label>
<label contenteditable="true" unselectable="off" for="ID477116">5-7</label>
<label contenteditable="true" unselectable="off" for="ID5515606">8 or more</label>

Или это выберет все содержимое тегов <label>, по одному на строку:

SELECT
    C.value('(.)[1]', 'varchar(1000)')
FROM @HtmlTbl 
CROSS APPLY Html.nodes('//label') AS T(C)
WHERE ID = 1

Выход:

1 or fewer
2-4
5-7
8 or more
0 голосов
/ 24 апреля 2019

Вы можете использовать PATINDEX и SUBSTRING, если хотите извлечь значение из четко определенного тега

 /*
    <HTML><head><meta name='viewport' content='width=device-width, initial-scale=1.0'>
    </head>
    <BODY onload='document.frmLaunch.submit();'> Redirecting... 
    <FORM name='frmLaunch' method='POST' action='https://acsabsatest.bankserv.co.za/mdpayacs/pareq'>
    <input type=hidden name='PaReq' value='eJxVUctuwjAQ/JWID8jaJjy1tRRKJXKg4iWQuLnOtkSUJDgJ0H597ZCU9pSZ2ex4dxY3B0M0XZOuDEmcU1GoD/KS+KmzWC1HnHWDHu9IXIQrOku8kCmSLJXcZ75AaKntM/qg0lKi0udJ9Co55wgNxhOZaCq56CLcIabqRHKi0mNB5hK+m0Qrr/VAqKuosyotzZcccIbQEqzMpzyUZV6MAa7Xq//WmPg6878VgqsjPOZZVA4V1u+WxHK3iWfrlzlf87lYH6NgyfP9bhvddtvwCcH9gbEqSQrGRywQgceGYz4aswCh1lGd3CByH6484TM7WCNg7t4J70S4wl8BbbqGUt0u0zKkW56l5FoQfjHGVGi7RPN5bPA8c/nq0iY47AeDXn9Qh1wLziqxAQnOerWXIwiuBZrjQXNdi/5d/Qf60asq'>
    <input type=hidden name='TermUrl' value='http://TermUrl'>
    <input type=hidden name='MD' value='469695'></FORM></BODY></HTML>
    */
--Find the start of the tag
    SELECT PATINDEX('%<input type=hidden name=''PaReq'' value=%', @webViewData); 
--(Answer is 246)
-->Find the end of the tag
    SELECT PATINDEX('%''>%', substring(@webViewData,PATINDEX('%<input type=hidden name=''PaReq'' value=%', @webViewData),len(@webViewData))); 
--(Answer is 468)
--Get the value content of the tag
    select substring(@webViewData,246+39,468-40)
--Everything combined:
    select substring(@webViewData,PATINDEX('%<input type=hidden name=''PaReq'' value=%', @webViewData)+39,PATINDEX('%''>%', substring(@webViewData,PATINDEX('%<input type=hidden name=''PaReq'' value=%', @webViewData),len(@webViewData)))-40)
0 голосов
/ 12 января 2012

Если весь ваш HTML так же хорошо сформирован, как этот, вы можете преобразовать его в XML и использовать XQuery для поиска узлов меток,

select T.N.value('.', 'nvarchar(100)')
from Table
    cross apply XMLCol.nodes('//label') as T(N)
0 голосов
/ 12 января 2012

Извлеките данные из БД, а затем используйте анализатор HTML, чтобы извлечь нужную информацию.Это сделает вашу жизнь намного легче.

Что бы вы ни делали, пожалуйста не пытайтесь использовать RegExs, если вы не только ищетеданные, которые соответствуют регулярному выражению.(поскольку HTML не является обычным языком, он часто вызывает больше проблем, чем решает)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...