Sample code for 30+ languages & platforms
Dart

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 Dart Downloads

Dart
import 'package:chilkat/chilkat.dart';

void main() {
  // 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..

  final xml1 = CkXml();
  xml1.tag = 'global';
  xml1.updateAttrAt('phrase', true, 'id', '2FADisabled');
  xml1.updateAttrAt('phrase', true, 'value', '2factor authentication disabled');
  xml1.updateAttrAt('phrase[1]', true, 'id', '2FAEnabled');
  xml1.updateAttrAt('phrase[1]', true, 'value', '2factor authentication enabled');
  xml1.updateAttrAt('phrase[2]', true, 'id', '2FAResetFailed');
  xml1.updateAttrAt('phrase[2]', true, 'value', 'Failed to disable two factor authentication');

  final xml2 = CkXml();
  xml2.tag = 'global';
  xml2.updateAttrAt('phrase', true, 'id', '2FAResetFailed');
  xml2.updateAttrAt('phrase', true, 'value', 'Failed to reset two factor authentication');
  xml2.updateAttrAt('phrase[1]', true, 'id', '2FADisabled');
  xml2.updateAttrAt('phrase[1]', true, 'value', '2FA authentication disabled');
  xml2.updateAttrAt('phrase[2]', true, 'id', '2FAEnabled');
  xml2.updateAttrAt('phrase[2]', true, 'value', '2FA authentication enabled');

  // Iterate over attribute values in xml2 and update the same in xml1.

  var phraseId = '';
  var phraseValue = '';

  final sbPath = CkStringBuilder();

  var i = 0;
  final countI = xml2.numChildrenHavingTag('phrase');
  while (i < countI) {
    xml2.i = i;
    phraseId = xml2.chilkatPath('phrase[i]|(id)');
    phraseValue = xml2.chilkatPath('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"
    sbPath.setString('/A/phrase,id,');
    sbPath.append(phraseId);

    // This assumes the corresponding element exists in xml1.
    xml1.updateAttrAt(sbPath.getAsString(), true, 'value', phraseValue);

    i++;
  }

  // Now see how xml1 has been updated..
  print(xml1.getXml());

  // <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>
}