ibmi-brunch-learn

Announcement

Collapse
No announcement yet.

XMLTABLE - how to test for tag existence?

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • XMLTABLE - how to test for tag existence?

    Say for example I have this XML document, stored in an XML type column on an SQL table:
    Code:
    <mydoc>
      <section1>
        <field1>value-11</field1>
        <field2>value-12</field2>
      </section1>
      <section2>
        <field1>value-21</field1>
        <field2>value-22</field2>
      </section2>
      <section3>
        <field1></field1>
      </section3>
      <section4></section4>
      <section5/>
    </mydoc>
    I want to test if the section1 tag exists.



    I know how to use XMLTABLE to extract values. The problem is, I do not know which of section1's subtags may or may not exist. I could read them all and check if any have a value, but there are hundreds.



    I think I have found a way, but I am very new to XPath so I do not know if this is the correct way to do it, I would really like confirmation.


    If I use XMLTABLE to target a node as follows, it will return the concatenation of all values of all children/descendents:
    Code:
    select chk, length(chk) from xt2,
    xmltable('/mydoc' passing xmlin columns
        chk varchar(120) default null path 'section1'
    ) as chktable;
    
    //chk = 'value-11value-12subvalue-11subvalue-12'
    //length(chk) = 38

    If the node exists but has no value, and none of its children (if any) have value, the same XMLTABLE returns a zero-length string:
    Code:
    select chk, length(chk) from xt2,
    xmltable('/mydoc' passing xmlin columns
        chk varchar(120) default null path 'section3'
    ) as chktable;
    
    //chk = ''
    //length(chk) = 0
    
    // Same for section4 and section5

    And finally, if the node does not exist, it returns null
    Code:
    select chk, length(chk) from xt2,
    xmltable('/mydoc' passing xmlin columns
        chk varchar(120) default null path 'section95'
    ) as chktable;
    
    //chk = null
    //length(chk) = null
    
    // Same for section4 and section5

    So all I think I have do do is this, and test if chk is null, zero-length, or some other value.


    Is this the right approach? or is there a better one?

  • #2
    As is often the case with me, I find the answer myself immediately after I ask the question.

    I have just discovered the data(), boolean(), and exists() xpath functions. I will be using those

    Comment

    Working...
    X