I looked into this at one point too. I ended up just doing a manual copy from read accessors of the parent to write accessors of the child.
Your XML copying method was one I did look into. I discovered two flaws in it that you might not have run across yet. First, any floating point number with a unit attached always unflattens as the default value unless it's nested in a cluster (most people don't use units, so not a big deal). Second, and more likely to be a thing, all Variant data is lost when unflattened from inside of a class.
The one thing I did find was a way to make a "trap" that catches when someone adds something to the parent class data that isn't in the "copy" function. You can run this code:
![Check private class control.png Check private class control.png]()
This generates a complete list of the parent class's elements, whether or not they have accessors. Call it on the parent class, and then convert the output arrays into constants. Then generate an error during run-time if the "live" arrays don't match the constants you generated in both size and contents. Every time you edit the "copy" function from parent to child, update the constants so it doesn't fail during run-time.
I suppose you could run similar code on the XML generated after you flatten it to get the names and data types of all of the XML nodes and compare, but the general method is the same.
Or, if you use unit tests, put this in the unit tests to catch it earlier...