1. ds.WriteXml("personcontact.xml")
<?xml version="1.0" standalone="yes"?>
<PersonContacts>
  <Person>
    <ID>1</ID>
    <FirstName>Wolfgang</FirstName>
    <Name>Beer</Name>
  </Person>
  <Person>
    <ID>2</ID>
    <FirstName>Dietrich</FirstName>
    <Name>Birngruber</Name>
  </Person>
  <Contact>
    <ID>1</ID>
    <FirstName>Dietrich</FirstName>
    <Name>Birngruber</Name>
    <NickName>Didi</NickName>
    <EMail>didi@example.com</EMail>
    <Phone>7133</Phone>
    <PersonID>2</PersonID>
  </Contact>
  <Contact>
    <ID>2</ID>
    <FirstName>Wolfgang</FirstName>
    <Name>Beer</Name>
    <PersonID>1</PersonID>
  </Contact>
</PersonContacts>

2. ds.WriteXmlSchema(...) -- the schema, as XML Schema (XSD)
<xs:schema id="PersonContacts" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="PersonContacts" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Person">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ID" type="xs:long" />
              <xs:element name="FirstName" type="xs:string" minOccurs="0" />
              <xs:element name="Name" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Contact">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ID" type="xs:long" />
              <xs:element name="FirstName" type="xs:string" minOccurs="0" />
              <xs:element name="Name" type="xs:string" minOccurs="0" />
              <xs:element name="NickName" type="xs:string" minOccurs="0" />
              <xs:element name="EMail" type="xs:string" minOccurs="0" />
              <xs:element name="Phone" type="xs:string" minOccurs="0" />
              <xs:element name="PersonID" type="xs:long" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
    <xs:unique name="Constraint1" msdata:PrimaryKey="true">
      <xs:selector xpath=".//Person" />
      <xs:field xpath="ID" />
    </xs:unique>
    <xs:unique name="Contact_Constraint1" msdata:ConstraintName="Constraint1" msdata:PrimaryKey="true">
      <xs:selector xpath=".//Contact" />
      <xs:field xpath="ID" />
    </xs:unique>
    <xs:keyref name="PersonHasContacts" refer="Constraint1">
      <xs:selector xpath=".//Contact" />
      <xs:field xpath="PersonID" />
    </xs:keyref>
  </xs:element>
</xs:schema>

3. ReadXml with XmlReadMode.InferSchema: the structure is guessed from the data
   Person: ID (String), FirstName (String), Name (String)
   Contact: ID (String), FirstName (String), Name (String), NickName (String), EMail (String), Phone (String), PersonID (String)
   relations: 0, primary key on Person: False

4. The same file read after ReadXmlSchema: the types and the relation survive
   Person: ID (Int64), FirstName (String), Name (String)
   Contact: ID (Int64), FirstName (String), Name (String), NickName (String), EMail (String), Phone (String), PersonID (Int64)
   relations: 1; person 2's contact is "Didi", phone 7133

5. A change, written as a DiffGram (XmlWriteMode.DiffGram)
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
  <PersonContacts>
    <Person diffgr:id="Person1" msdata:rowOrder="0" diffgr:hasChanges="modified">
      <ID>1</ID>
      <FirstName>Wolfgang</FirstName>
      <Name>Bier</Name>
    </Person>
    <Person diffgr:id="Person2" msdata:rowOrder="1" diffgr:hasChanges="inserted">
      <ID>3</ID>
      <FirstName>Hendra</FirstName>
      <Name>Wijaya</Name>
    </Person>
  </PersonContacts>
  <diffgr:before>
    <Person diffgr:id="Person1" msdata:rowOrder="0">
      <ID>1</ID>
      <FirstName>Wolfgang</FirstName>
      <Name>Beer</Name>
    </Person>
  </diffgr:before>
</diffgr:diffgram>
