ceturtdiena, 2012. gada 22. marts

Meklēšana XML datos

Daži vienkārši piemēri, kā atrast datus SQL Server XML datos izmantojot XPath. (no XML SQL Server sērijas)

Izmantojot XPath var atrast nepieciešamo jebkurā derīgā XML dokumentā (vai XML dokumenta fragmentā). "Nepieciešamais" var būt gan elements, gan atribūts, gan konkrēta elementa vai atribūta vērtība. Atkarībā no tā, ko vēlamies darīt, jāizmanto kāda no XML metodēm (SQL Server XML Datu tipa metodes). XPath sintakse www.w3schools.com.

Pieņemsim, ka XML dokumentā vēlamies atrast konkrētu elementa/atribūt vērtību. Izmantojot XML datu tipa "value" metodi- jāņem vērā, ka XPath ir reģistrjūtīgs:
Declare @myXML XML;
Set @myXML  =
N'
<PersonInfo>
    <Person ID="21" VIP="0">
        <Name>Jānis</Name>
        <LastName>Bērziņš</LastName>
    </Person>
    <Person ID="22" VIP="1">
        <Name>Liene</Name>
        <LastName>Lapiņa</LastName>
        <Profession>Analītiķe</Profession>
    </Person>
</PersonInfo>
';
Select
    -- Pirmās personas vārds:
    @myXML.value('(/PersonInfo/Person/Name)[1]', 'varchar(50)'),
    -- Otrās personas ID
    @myXML.value('(/PersonInfo/Person)[2]/@ID', 'int'),
    -- Personas ar ID = 22 vārdu
    @myXML.value('(/PersonInfo/Person[@ID="22"]/Name)[1]', 'varchar(50)'),
    -- Personas ar VIP = 1 un profesiju "Analītiķe" vārdu
    @myXML.value('(/PersonInfo/Person[@ID="22" and Profession="Analītiķe"]/Name)[1]', 'varchar(50)'),
    -- Personas ar VIP = 1 un profesiju "Analītiķe" vārdu. 2. veids
    @myXML.value('(/PersonInfo[Person/Profession="Analītiķe"]/Person[@ID="22"]/Name)[1]', 'varchar(50)'),
    -- Personas ar VIP = 1 un profesiju "Analītiķe" vārdu. 3. veids
    @myXML.value('(/PersonInfo/Person[@ID="22"]/Name[../Profession="Analītiķe"])[1]', 'varchar(50)'),
    -- Personas ar VIP = 1 un profesiju "Analītiķe" vārdu. 4. veids
    @myXML.value('(/PersonInfo[Person/@ID="22"]/Person/Name[../Profession="Analītiķe"])[1]', 'varchar(50)')
Pieņēmām, ka tiks atrasta tikai viena vērtība. Bet izmantojot XML "nodes" metodi var atrast vairākas vērtības:
Declare @myXML XML;
Set @myXML  =
N'
<PersonInfo>
    <Person ID="21" VIP="0">
        <Name>Jānis</Name>
        <LastName>Bērziņš</LastName>
    </Person>
    <Person ID="23" VIP="1">
        <Name>Zane</Name>
        <LastName>Kalniņa</LastName>
    </Person>
    <Person ID="22" VIP="1">
        <Name>Liene</Name>
        <LastName>Lapiņa</LastName>
        <Profession>Analītiķe</Profession>
    </Person>
</PersonInfo>
';
-- atlasa visas personas:
Select P.e.query('.')
From @myXML.nodes('/PersonInfo/Person') As P(e);
-- atlasa visas Vip personas, to vārdi, uzvārdi, profesijas:
Select
    P.e.value('(@ID)[1]', 'varchar(50)') ID,
    P.e.value('(Name)[1]', 'varchar(50)') Vards,
    P.e.value('(LastName)[1]', 'varchar(50)') Uzvards,
    P.e.value('(Profession)[1]', 'varchar(50)') Profesija
From @myXML.nodes('/PersonInfo/Person[@VIP = "1"]') As P(e);
-- atlasa visus ID, kam ir profesija
Select P.e.value('(@ID)[1]', 'varchar(50)') ID
From @myXML.nodes('/PersonInfo/Person[Profession=*]') As P(e);
-- atlasa elementus, kam ir jebkādi atribūti
Select P.e.value('(@ID)[1]', 'varchar(50)') ID
From @myXML.nodes('//*[@*]') As P(e);
-- atlasa elementus, kam ir ID atribūts
Select P.e.value('(@ID)[1]', 'varchar(50)') ID
From @myXML.nodes('//*[@ID]') As P(e);
Un ja XML tiek izmantota vārdtelpa, tad var uzmest aci rakstam Datu izgūšana no XML: XML vārdtelpas (namespaces).

Nav komentāru:

Komentāra publicēšana