I ended up using the XmlSerializer class.
I started by creating one root data class; our game was called Outrage so I named it OutrageGameInstance. This class had one instance of Dog (our main character), a List of possible pickup item types, and a List of levels. Each of these structures had other data variables. Any variables that I didn't want in the XML file, I just wrote [NonSerializable]
in the line above the variable declaration. I also found out through experimentation that only public variables are serialized, so I could hide things in private variables.
Anyway, I commented out the usual bit in Program.cs and put in some code to create an example instance of OutrageGameInstance, and then serialized it using XmlSerializer. This gave me a file that I could then tweak by hand, and as you see below the syntax is real easy to understand and add to. I switched back the Program.cs file, and put the XML file into the Content project. In the properties for the XML file, change the build action to 'none' (compile made errors) and set it to always copy to output directory.
Then it's just a matter of using an XmlSerializer to deserialize the XML file in the Initialize function of the Game class, and use the data however you want!
This was my data file, just to show you how easy it was to edit:
<?xml version="1.0" encoding="utf-8"?>
<OutrageGameInstance xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<dog>
<scale>
<X>0.3</X>
<Y>0.3</Y>
</scale>
</dog>
<pickupTypes>
<PickupType>
<picture>Bone</picture>
<collideSound>BoneMunch</collideSound>
<animationType>none</animationType>
<scoreValue>5</scoreValue>
<scale>
<X>0.3</X>
<Y>0.3</Y>
</scale>
</PickupType>
</pickupTypes>
<levels>
<Level>
<playerStart>100</playerStart>
<dogHead>Level1/dog_head</dogHead>
<dogTail>Level1/dog_tail</dogTail>
<floor>668</floor>
<name>Flowers!</name>
<background>Level1/background</background>
<foreground>Level1/foreground</foreground>
<pickupInstances>
<PickupInstance>
<type>Bone</type>
<location>
<X>50</X>
<Y>50</Y>
</location>
</PickupInstance>
<PickupInstance>
<type>Bone</type>
<location>
<X>850</X>
<Y>50</Y>
</location>
</PickupInstance>
<PickupInstance>
<type>Bone</type>
<location>
<X>300</X>
<Y>250</Y>
</location>
</PickupInstance>
<PickupInstance>
<type>Bone</type>
<location>
<X>600</X>
<Y>250</Y>
</location>
</PickupInstance>
</pickupInstances>
<gravity>0.3</gravity>
<backgroundMusic>BackgroundMusic1</backgroundMusic>
<madMeter>Level1/thermo_happy</madMeter>
</Level>
<Level>
<playerStart>100</playerStart>
<dogHead>Level1/dog_head</dogHead>
<dogTail>Level1/dog_tail</dogTail>
<floor>668</floor>
<name>Flowers!</name>
<background>Level1/background</background>
<foreground>Level1/foreground</foreground>
<pickupInstances>
<PickupInstance>
<type>Bone</type>
<location>
<X>50</X>
<Y>250</Y>
</location>
</PickupInstance>
<PickupInstance>
<type>Bone</type>
<location>
<X>850</X>
<Y>250</Y>
</location>
</PickupInstance>
<PickupInstance>
<type>Bone</type>
<location>
<X>300</X>
<Y>50</Y>
</location>
</PickupInstance>
<PickupInstance>
<type>Bone</type>
<location>
<X>600</X>
<Y>50</Y>
</location>
</PickupInstance>
</pickupInstances>
<gravity>0.3</gravity>
<backgroundMusic>BackgroundMusic1</backgroundMusic>
<madMeter>Level2/thermo_inshock</madMeter>
</Level>
</levels>
</OutrageGameInstance>