Tcl
Tcl
Find and Update an XML Attribute Value
See more XML Examples
Demonstrates how to find an element in XML with a specified attribute name and then update the attribute value.Chilkat Tcl Downloads
load ./chilkat.dll
# Let's say you have 2 XML files with identical structures as shown directly below,
# and you wish to update the values in the 1st XML file with those in the 2nd XML file.
# <global>
# <phrase id="2FADisabled" value="2factor authentication disabled"/>
# <phrase id="2FAEnabled" value="2factor authentication enabled"/>
# <phrase id="2FAResetFailed" value="Failed to disable two factor authentication"/>
# </global>
# <global>
# <phrase id="2FAResetFailed" value="Failed to reset two factor authentication"/>
# <phrase id="2FADisabled" value="2FA authentication disabled"/>
# <phrase id="2FAEnabled" value="2FA authentication enabled"/>
# </global>
# First, initialize each of the Chilkat XML objects.
# These could be loaded from files, but we'll just create them manually for this example..
set xml1 [new_CkXml]
CkXml_put_Tag $xml1 "global"
CkXml_UpdateAttrAt $xml1 "phrase" 1 "id" "2FADisabled"
CkXml_UpdateAttrAt $xml1 "phrase" 1 "value" "2factor authentication disabled"
CkXml_UpdateAttrAt $xml1 "phrase[1]" 1 "id" "2FAEnabled"
CkXml_UpdateAttrAt $xml1 "phrase[1]" 1 "value" "2factor authentication enabled"
CkXml_UpdateAttrAt $xml1 "phrase[2]" 1 "id" "2FAResetFailed"
CkXml_UpdateAttrAt $xml1 "phrase[2]" 1 "value" "Failed to disable two factor authentication"
set xml2 [new_CkXml]
CkXml_put_Tag $xml2 "global"
CkXml_UpdateAttrAt $xml2 "phrase" 1 "id" "2FAResetFailed"
CkXml_UpdateAttrAt $xml2 "phrase" 1 "value" "Failed to reset two factor authentication"
CkXml_UpdateAttrAt $xml2 "phrase[1]" 1 "id" "2FADisabled"
CkXml_UpdateAttrAt $xml2 "phrase[1]" 1 "value" "2FA authentication disabled"
CkXml_UpdateAttrAt $xml2 "phrase[2]" 1 "id" "2FAEnabled"
CkXml_UpdateAttrAt $xml2 "phrase[2]" 1 "value" "2FA authentication enabled"
# Iterate over attribute values in xml2 and update the same in xml1.
set sbPath [new_CkStringBuilder]
set i 0
set count_i [CkXml_NumChildrenHavingTag $xml2 "phrase"]
while {$i < $count_i} {
CkXml_put_I $xml2 $i
set phrase_id [CkXml_chilkatPath $xml2 "phrase[i]|(id)"]
set phrase_value [CkXml_chilkatPath $xml2 "phrase[i]|(value)"]
# Notice how the UpdateAttrAt method's 1st argument is a Chilkat path -- which is an expression
# to find the location of the XML element to be updated.
# Here we create a path of the form "/A/tagName,attributeName,attributeValuePattern", which means
# find the direct descendent of xml2 having tag=tagName, with an attribute=attributeName where the attribute value
# matches the attributeValuePattern. If attributeValuePattern does not contain a "*", then it must match directly.
# We'll build a Chilkat path such as "/A/phrase,id,2FADisabled"
CkStringBuilder_SetString $sbPath "/A/phrase,id,"
CkStringBuilder_Append $sbPath $phrase_id
# This assumes the corresponding element exists in xml1.
CkXml_UpdateAttrAt $xml1 [CkStringBuilder_getAsString $sbPath] 1 "value" $phrase_value
set i [expr $i + 1]
}
# Now see how xml1 has been updated..
puts [CkXml_getXml $xml1]
# <global>
# <phrase id="2FADisabled" value="2FA authentication disabled"/>
# <phrase id="2FAEnabled" value="2FA authentication enabled"/>
# <phrase id="2FAResetFailed" value="Failed to reset two factor authentication"/>
# </global>
delete_CkXml $xml1
delete_CkXml $xml2
delete_CkStringBuilder $sbPath