এক্সএমএল হিসাবে এইচটিএমএল কোডটি কীভাবে পড়বেন এবং সিক্যালে নমুনার মতো আউটপুট পাবেন?


11

আমার কাছে ডেটা বেসে এইচটিএমএল কোড রয়েছে এবং আমি এটি এক্সএমএল হিসাবে পড়তে চাই।

আমার কোডগুলি:

http://rextester.com/RMEHO89992

এটি আমার কাছে থাকা HTML কোডের একটি উদাহরণ:

<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>

এবং এটি আমার প্রয়োজনীয় আউটপুটটির একটি উদাহরণ:

Category         Selection        Value                    
---------        ---------        ------------             
A                Ab               AD                  
A                Ag               AL                       
B                Bb               BD                   
B                Bg               BL                       

আমার <h4>হিসাবে ট্যাগের Categoryমধ্যে প্রথমটি, <span>নির্বাচনের হিসাবে প্রথম ট্যাগটি এবং বাকী মানগুলি একটি কাঠের স্ট্রিং হিসাবে পাওয়া দরকার।

আমি নিম্নলিখিত জিজ্ঞাসা চেষ্টা করেছি:

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) 

এবং :

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)

তবে এটি কেবল প্রথম বিভাগটি পায় এবং সমস্ত মান টগিটার পায় না।

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 

এন বিভাগ থাকতে পারে এবং মানগুলি <span>ট্যাগের মধ্যে থাকতে পারে বা নাও পারে । কীভাবে আমি সমস্ত বিভাগগুলি তাদের সম্পর্কিত মান সহ পেতে পারি? বা পেতে:

category              h4 number
--------            -----------
 A                     1
 B                     2
  • 1, গড় = h4 প্রথম, 2, গড় = এইচ 4 সেকেন্ড
 ul number         Selection        Value                    
    ---------        ---------        ------------             
    1                Ab               AD                  
    1                Ag               AL                       
    2                Bb               BD                   
    2                Bg               BL       

কলাম উল নম্বর এবং এইচ 4 সংখ্যার মধ্যে সম্পর্ক। আমি পারি না.


1
আপনি কি নিশ্চিত যে প্রত্যাশিত ফলাফলটি সঠিক? এটি কি AD ACতৃতীয় কলামে প্রথম সারির জন্য হওয়া উচিত নয় ?
মিকেল এরিকসন

আমি নোডেস এইচ 4` এবং `উল between এর মধ্যে যোগাযোগ স্থাপনের চেষ্টা করছি`
রেডআরমি

উত্তর:


7

এটি ঠিক মার্জিত নয় তবে কাজটি করার মতো বলে মনে হচ্ছে।

DECLARE @X XML = REPLACE(REPLACE(@S, '<h4>', '<foo><h4>'), '</ul>', '</ul></foo>')

SELECT Category = x.value('../../h4[1]/span[1]', 'varchar(10)'),
       Selection = x.value('descendant-or-self::text()[1]', 'varchar(10)'),
       Value = REPLACE(
                REPLACE(
                 REPLACE(
                  LTRIM(
                   RTRIM(
                    REPLACE(
                     REPLACE(
                      CAST(x.x.query('fn:data(descendant-or-self::text()[fn:position() > 1])') AS VARCHAR(MAX))
                     , char(10), '')
                    , char(13), '')
                   )
                  )
                 , '  ', ' |')
                , '| ', '')
               , '|', '')
FROM   @X.nodes('div/section/foo/ul/li') x(x)
ORDER  BY Category,
          Selection

যা ফিরে আসে

+----------+-----------+-------+
| Category | Selection | Value |
+----------+-----------+-------+
|  A       |  Ab       | AD AC |
|  A       |  Ag       | AL    |
|  B       |  Bb       | BD BC |
|  B       |  Bg       | BL    |
+----------+-----------+-------+

আমি ধরে নিচ্ছি এটিই আপনি যা চান প্রশ্নটিতে পছন্দসই ফলাফলের টেবিলটি "বাকী মানগুলিকে সংক্ষেপিত স্ট্রিং হিসাবে" ফিরিয়ে দেয় না


14

আমি নোড h4এবং এর মধ্যে যোগাযোগ স্থাপনের চেষ্টা করছি ul

নোডের ক্রমে কোনও নোডের আগে বা পরে নোড রয়েছে কিনা তা পরীক্ষা করতে আপনি <<এবং >>অপারেটরটি ব্যবহার করতে পারেন । পজিশনে একটি প্রিফিকের সাথে এটি একত্রিত করুন, [1]ডকুমেন্ট ক্রমে প্রথম ঘটনাটি পেতে।

select H4.X.value('(span/text())[1]', 'varchar(10)') as Section,
       UL.X.query('.') as UL
from @X.nodes('/div/section/h4') as H4(X)
  cross apply H4.X.nodes('(let $h4 := . (: Save current h4 node :)
                           return /div/section/ul[$h4 << .])[1]') as UL(X);

rextester:

<<এবং নোড অর্ডার তুলনা অপারেটর>> বলা হয়

আপনার যদি এর মতো কোনও এক্সএমএল খণ্ড থাকে:

<N1>1</N1>
<N2>2</N2>
<N3>3</N3>
<N4>4</N4>
<N5>5</N5>

আপনি N3এই ক্যোয়ারির সাথে প্রথম ঘটনার আগে সমস্ত নোড পেতে পারেন :

select @X.query('/*[. << /N3[1]]');

ফলাফল:

<N1>1</N1>
<N2>2</N2>

/*আপনাকে সমস্ত রুট নোড দেবে। যা বদ্ধ রয়েছে []তা হ'ল এক প্রিকিকেট। .বর্তমান নোড এবং /N3[1]মূল স্তরের নথির ক্রমে প্রথম এন 3 নোড। সুতরাং প্রতিটি রুট নোড থেকে আপনি পূর্বে নোড পেতে N3

এখানে প্রায় একই ক্যোয়ারী, কেবলমাত্র আপনি প্রথম নোড অনুসরণ করে N3নোড পাবেন:

select @X.query('/*[. >> /N3[1]]');
<N4>4</N4>
<N5>5</N5>

প্রথম নোডের পরে কেবল প্রথম N3নোডটি পেতে, আপনি প্রেডিকেট যুক্ত করুন [1]:

select @X.query('/*[. >> /N3[1]][1]');
<N4>4</N4>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.