Используя SQL, прочитайте HTML-данные как XML - PullRequest
0 голосов
/ 29 августа 2018

Я должен читать данные таблицы HTML как XML. Но я не могу получить всю информацию в требуемом формате.

      declare @xml xml='<body bgcolor="#FFFFFF">
  <div id="Edit01" style="position:absolute; left:5px; top:4px; width:462px; height:196px; z-index:1">    
    <table width="462" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td colspan="5" width="462">
          <span class="auditnoteheader">Charges: </span>
        </td>
      </tr>
      <tr>
        <td colspan="5" width="462">
          <span class="AuditNoteText">Submitted by ELSGH </span>
        </td>
      </tr>
      <tr>
        <td colspan="5" width="462">
          <span class="AuditNoteText">Jul 20 2018  9:15PM Eastern Standard Time</span>
        </td>
      </tr>
      <tr class="AuditNoteSubHeader">
        <td width="8" />
        <td width="230" valign="top">Charge</td>
        <td width="110" valign="top">Old Charge Status</td>
        <td width="114" valign="top">New Charge Status</td>
      </tr>
      <tr class="AuditNoteText">
        <td width="8" />
        <td width="230" valign="top">
          <font color="009900">99214      OFFICE OUTPATIENT VISIT 25 MINUTES</font>
        </td>
        <td width="110" valign="top">
          <font color="009900">Review</font>
        </td>
        <td width="114" valign="top">
          <font color="009900">Submitted</font>
        </td>
      </tr>
      <tr class="AuditNoteText">
        <td width="8" />
        <td width="230" valign="top">
          <font color="009900">36415      COLLECTION VENOUS BLOOD</font>
        </td>
        <td width="110" valign="top">
          <font color="009900">Review</font>
        </td>
        <td width="114" valign="top">
          <font color="009900">Submitted</font>
        </td>
      </tr>
      <tr class="AuditNoteSeparater">
        <td colspan="5" height="2">
                    --------------------------------------------------------------------------------------------
                </td>
      </tr>
    </table>
  </div>
</body>'

Я пытался использовать этот запрос.

 SELECT TR.AT1.query('data(span)') ,TR.AT1.query('*') ,TR.AT1.value('.','varchar(max)')
FROM @xml.nodes('/body/div/table') as T(N)
cross apply T.N.nodes('./tr/td') as TR(AT1)
cross apply TR.AT1.nodes('.') as para(p1)

Внутри тега body я получаю несколько таблиц. первые 3 тега (могут быть разными) - это информация таблицы. Следующая строка с class = "AuditNoteSubHeader" является заголовком таблицы, и после нее все class = "AuditNoteText" содержит данные таблицы. Мне нужно извлечь всю эту информацию. Может ли кто-нибудь помочь в этом?

Мой ожидаемый результат:

enter image description here

для AuditNoteText Я получаю несколько строк, поэтому для разграничения я дал такие номера, как AuditNoteText1, AuditNoteText2.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Ваш ожидаемый результат - не лучший формат в моих глазах. Если это не является внешней потребностью, вы можете попробовать что-то вроде этого:

;WITH AllTr AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowIndex
          ,tr.value('@class','nvarchar(max)') AS trClass  
          ,tr.query('.') AS trNode
    FROM @xml.nodes('//table/tr') A(tr)
)
,AllTd AS
(
    SELECT AllTr.*
          ,ROW_NUMBER() OVER(PARTITION BY RowIndex ORDER BY (SELECT NULL)) AS ColumnIndex
          ,td.value('(.//*/@class)[1]','nvarchar(max)') AS tdClass  
          ,td.value('(.//text())[1]','nvarchar(max)') AS tdText
    FROM AllTr
    OUTER APPLY trNode.nodes('tr/td[.//text()]') A(td)
)
SELECT RowIndex
      ,ColumnIndex
      ,trClass
      ,tdClass
      ,tdText
FROM AllTd;

Это обеспечит счетчик строк и счетчик секционированных столбцов. Это может быть лучше, чем имя с номером имя класса.

0 голосов
/ 29 августа 2018
;WITH C1 AS (
  SELECT    ISNULL(T.N.value('@class', 'varchar(50)'), TR1.AT1.value('@class', 'varchar(50)')) Hdr
            , CONVERT(VARCHAR, DENSE_RANK() OVER ( PARTITION BY TR1.AT1 ORDER BY N )-1) AS HdrNum
          , TR.AT1.value('.', 'varchar(max)') AS Data
  FROM      @xml.nodes('/body/div/table/tr,/body/div/table/tr/td/span') AS T ( N )  
            CROSS APPLY T.N.nodes('./td') AS TR ( AT1 )
            OUTER APPLY T.N.nodes('./td/span') AS TR1 ( AT1 ) 
            WHERE TR.AT1.value('.', 'varchar(max)') NOT LIKE '%---%' 
                    AND TR.AT1.value('.', 'varchar(max)') <> ''
 )
 SELECT Hdr + CASE WHEN HdrNum = '0' THEN '' ELSE HdrNum END AS Hdr
 , Data
 FROM C1 ORDER BY hdr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...