DataFlex
DataFlex
XML SearchForAttribute Method
See more XML Examples
Demonstrates the SearchForAttribute method.The input XML, available at http://www.chilkatsoft.com/data/fruitSearch.xml, is this:
<root>
<searchRoot>
<fruit color="red">apple</fruit>
<fruit color="green">pear</fruit>
<veg color="orange">carrot</veg>
<meat animal="cow">beef</meat>
<xyz>
<fruit color="blue">blueberry</fruit>
<veg color="green">broccoli</veg>
</xyz>
<fruit color="purple">grape</fruit>
<cheese color="yellow">cheddar</cheese>
</searchRoot>
<fruit color="red">strawberry</fruit>
<fruit color="orange">peach</fruit>
</root>
Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoXml
Variant vXSearchRoot
Handle hoXSearchRoot
Variant vXBeginAfter
Handle hoXBeginAfter
Variant vXFound
Handle hoXFound
Variant vXSearch
Handle hoXSearch
String sTemp1
String sTemp2
Boolean bTemp1
Move False To iSuccess
Get Create (RefClass(cComChilkatXml)) To hoXml
If (Not(IsComObjectCreated(hoXml))) Begin
Send CreateComObject of hoXml
End
Get ComLoadXmlFile Of hoXml "qa_data/xml/fruitSearch.xml" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoXml To sTemp1
Showln sTemp1
Procedure_Return
End
// Search the sub-tree rooted at "searchRoot"
Get ComFindChild Of hoXml "searchRoot" To vXSearchRoot
If (IsComObject(vXSearchRoot)) Begin
Get Create (RefClass(cComChilkatXml)) To hoXSearchRoot
Set pvComObject Of hoXSearchRoot To vXSearchRoot
End
Get ComLastMethodSuccess Of hoXml To bTemp1
If (bTemp1 = False) Begin
Showln "searchRoot not found, searching from root."
Get ComGetRoot Of hoXml To vXSearchRoot
If (IsComObject(vXSearchRoot)) Begin
Get Create (RefClass(cComChilkatXml)) To hoXSearchRoot
Set pvComObject Of hoXSearchRoot To vXSearchRoot
End
End
// Search for all "fruit" nodes having a color attribute
// where the name of the color ends in "e"
Get ComGetSelf Of hoXSearchRoot To vXBeginAfter
If (IsComObject(vXBeginAfter)) Begin
Get Create (RefClass(cComChilkatXml)) To hoXBeginAfter
Set pvComObject Of hoXBeginAfter To vXBeginAfter
End
Get ComSearchForAttribute Of hoXSearchRoot vXBeginAfter "fruit" "color" "*e" To vXFound
If (IsComObject(vXFound)) Begin
Get Create (RefClass(cComChilkatXml)) To hoXFound
Set pvComObject Of hoXFound To vXFound
End
While ((ComLastMethodSuccess(hoXSearchRoot)) = True)
Get ComContent Of hoXFound To sTemp1
Get ComGetAttrValue Of hoXFound "color" To sTemp2
Showln sTemp1 ": " sTemp2
Send Destroy of hoXBeginAfter
Move hoXFound To hoXBeginAfter
Get ComSearchForAttribute Of hoXSearchRoot vXBeginAfter "fruit" "color" "*e" To vXFound
If (IsComObject(vXFound)) Begin
Get Create (RefClass(cComChilkatXml)) To hoXFound
Set pvComObject Of hoXFound To vXFound
End
Loop
// The correct output is:
// grape: purple
// blueberry: blue
Send Destroy of hoXBeginAfter
Showln "--------------------------"
// ---------------------------------------------------------------------------------
// Now do the same, but instead use SearchForAttribute2
// which updates the internal reference of the caller instead
// of returning the found node.
Get ComGetSelf Of hoXSearchRoot To vXBeginAfter
If (IsComObject(vXBeginAfter)) Begin
Get Create (RefClass(cComChilkatXml)) To hoXBeginAfter
Set pvComObject Of hoXBeginAfter To vXBeginAfter
End
Get ComGetSelf Of hoXSearchRoot To vXSearch
If (IsComObject(vXSearch)) Begin
Get Create (RefClass(cComChilkatXml)) To hoXSearch
Set pvComObject Of hoXSearch To vXSearch
End
Get ComSearchForAttribute2 Of hoXSearch vXBeginAfter "fruit" "color" "*e" To iSuccess
While (iSuccess = True)
Get ComContent Of hoXSearch To sTemp1
Get ComGetAttrValue Of hoXSearch "color" To sTemp2
Showln sTemp1 ": " sTemp2
// Copy the internal references so that the next search
// begins after the found node.
Send ComCopyRef To hoXBeginAfter vXSearch
Send ComCopyRef To hoXSearch vXSearchRoot
Get ComSearchForAttribute2 Of hoXSearch vXBeginAfter "fruit" "color" "*e" To iSuccess
Loop
Send Destroy of hoXSearch
Send Destroy of hoXBeginAfter
Send Destroy of hoXSearchRoot
End_Procedure