Here's an alternative:
declare @children int
set @children = 4
SELECT
string,
STUFF(string, start_of_integer_value, CHARINDEX('<', string, start_of_integer_value) - start_of_integer_value,
CAST(@children AS varchar(10)))
FROM (
SELECT '<key>Children</key><integer>2</integer>' AS string UNION ALL
SELECT '<key>Children</key><integer>123</integer>' UNION ALL
SELECT '<key>Children</key><integer></integer>'
) AS test_data
CROSS APPLY (
SELECT CHARINDEX('<integer>', string) + 9 AS start_of_integer_value
) AS assign_alias_name
SQL DBA,SQL Server MVP(07, 08, 09) A socialist is someone who will give you the shirt off *someone else's* back.