Here is one possibility. It is a regex that tries to recognize the contents between the single quotes as XML. It's not a perfect regex for this. It really depends on your requirements if it is ok to use. The more accurate the regex has to be, the more difficult it becomes to read. As it is, this expression will not match all XML and will match some invalid XML as well.
For example this regex will match tags with names that start with numbers. It would also match XML closing tags with attributes. You could tweak it depending on your needs.
Here it is:
push\s+'\s*<(\w+)(?:\s+\w+=(?:"[^"]*"|'[^']*'))*>(?:[^<]+|(?!</\1>)</?\w+(?:\s+\w+=(?:"[^"]*"|'[^']*'))*\s*/?>)*</\1>\s*'
Here is a breakdown of the expression. The start of the push statement:
push\s+'\s*
Detect the root XML tag and capture its name. Allow for attributes that are single and double quote delimited.:
<(\w+)(?:\s+\w+=(?:"[^"]*"|'[^']*'))*>
Loop through all the inner tags and text elements inside the root tag. Allow for attributes that are single and double quote delimited.
(?:[^<]+|(?!</\1>)</?\w+(?:\s+\w+=(?:"[^"]*"|'[^']*'))*\s*/?>)*
Capture the closing root tag.
</\1>\s*'
You could also try simply capturing the push commands and run their values through a function like in this solution:
How to check for valid xml in string input before calling .LoadXml()