Jestem nowy w Xpath i to jest mój XML. Próbuję uzyskać wartość atrybutów @Name w tagu zadania Appl / * __, a wartość "Testqueue" w węźle SNMP_Notify / Mession i mam jeden krok na raz. Na razie udało mi się zdobyć węzły dziecka wszystkiego _job, ale nie mogłem uzyskać wartości w węźle / SNMP_Notifylist / SNMP_Notifikacji / wiadomości. To jest SQL i czy ktoś może mi pomóc w identyfikacji, gdzie utknąłem.

Jest to przykładowy dokument XML zapisany jako definicja w tablicy Tab_ar.

<appl xmlns="http://dto.wa.ca.com/application" name="TEST_NEW_AGENT">
   <version>12.0</version>
   <comment />
   <unix_job name="TEST_JOB">
     <dependencies><relcount>0</relcount></dependencies>
      <snmp_notifylist>
       <snmp_notify>
         <returncode>4</returncode>
           <monitor_states><monitor_state>FAILED</monitor_state></monitor_states>
           <snmpagent />
           <message>TICKET TESTQUEUE TSTMSG</message>
      </snmp_notify>
   </snmp_notifylist>
 </unix_job>
 <link name="HOLD_LINK">
    <dependencies><relcount>0</relcount></dependencies>
    <hold>true</hold>
   <job_ancestor_wait_default_ignore>true</job_ancestor_wait_default_ignore>
 </link>
 <sftp_job name="TEST_SFTP1">
    <dependencies><relcount>0</relcount></dependencies>
    <snmp_notifylist>
         <snmp_notify>
           <returncode>4</returncode>
             <monitor_states>
                 <monitor_state>FAILED</monitor_state>
             </monitor_states>
            <snmpagent />
            <message>TICKET MFG1AWA TSTMSG</message>
            </snmp_notify>
    </snmp_notifylist>
</sftp_job>
</appl>

I to jest SQL, który napisałem,

 SELECT  
 SFTP_Job_name = DEFT1.value('(@name)[1]','nvarchar(max)'),
 Server_Address = DEFT1.query('local-name(/*:snmp_notifylist/*:snmp_notify/*:message)')
 from (select CAST([DEFINITION] as XML) as DEFT from TAB_AR)TAB
 CROSS APPLY TAB.DEFT.nodes('/*:appl/*[fn:contains(local-name(),"_job")]') as XMLTAB1(DEFT1)
1
Vignesh 17 luty 2017, 15:32

1 odpowiedź

To wydaje się działać:

with xmlnamespaces (default 'http://dto.wa.ca.com/application')
select j.c.value('./@name', 'sysname') as [JobName],
    m.c.value('./text()[1]', 'varchar(max)') as [MessageText]
from (
    select cast(t.[Definition] as xml) as [Deft] from tab_ar t
) sq
    cross apply sq.Deft.nodes('/appl/*[fn:contains(local-name(),"_job")]') j(c)
        cross apply j.c.nodes('./snmp_notifylist/snmp_notify/message') m(c);

Po tym podzielanie ciągu przez przestrzenie i biorąc środkową część powinno być stosunkowo trywialne.

1
Roger Wolf 17 luty 2017, 17:33