canonicalizeXml static method

String canonicalizeXml(
  1. String xmlString
)

Implementation

static String canonicalizeXml(String xmlString) {
  final document = XmlDocument.parse(xmlString);

  // Recursively sort attributes and format the nodes
  String normalizeNode(XmlNode node) {
    if (node is XmlElement) {
      final sortedAttributes =
          node.attributes.toList()
            ..sort((a, b) => a.name.toString().compareTo(b.name.toString()));

      final buffer = StringBuffer();
      buffer.write('<${node.name}');

      for (var attr in sortedAttributes) {
        buffer.write(' ${attr.name}="${attr.value}"');
      }

      buffer.write('>');

      for (var child in node.children) {
        buffer.write(normalizeNode(child));
      }

      buffer.write('</${node.name}>');
      return buffer.toString();
    } else if (node is XmlText) {
      return node.value;
    } else if (node is XmlProcessing) {
      // Skip XML declaration
      return '';
    } else {
      return node.toXmlString();
    }
  }

  final normalizedXml = normalizeNode(document.rootElement);
  return normalizedXml;
}