 
Very diverse use cases:
import libxml2
reader = libxml2.newTextReaderFilename("ex.xml")
ret = reader.Read()
while ret == 1:
    print reader.Name()
    ret = reader.Read()
More extensive validation than DTDs
Counter proposal to W3C XML Schemas
Consider some simple XML:
<addressBook>
  <card>
    <name>John Smith</name>
    <email>js@example.com</email>
  </card>
  <card>
    <name>Fred Bloggs</name>
    <email>fb@example.net</email>
  </card>
</addressBook>
The DTD for it:
<!DOCTYPE addressBook [ <!ELEMENT addressBook (card*)> <!ELEMENT card (name, email)> <!ELEMENT name (#PCDATA)> <!ELEMENT email (#PCDATA)> ]>
The Relax-NG schema for it:
<element name="addressBook" xmlns="http://relaxng.org/ns/structure/1.0">
  <zeroOrMore>
    <element name="card">
      <element name="name">
        <text/>
      </element>
      <element name="email">
        <text/>
      </element>
    </element>
  </zeroOrMore>
</element>
If using attributes:
<element name="card">
  <attribute name="name">
    <text/>
  </attribute>
  <attribute name="email">
    <text/>
  </attribute>
</element>
Relax-NG has an unified model for attributes and elements.
Using attributes or elements:
<element name="card">
  <choice>
    <element name="name">
      <text/>
    </element>
    <attribute name="name">
      <text/>
    </attribute>
  </choice>
  <choice>
    <element name="email">
      <text/>
    </element>
    <attribute name="email">
      <text/>
    </attribute>
  </choice>
</element>
Relax-NG allows to type-check textual content
 Reuse of the W3C XML Schemas Datatype library
 
Modular structure using includes
Use the define and ref to reuse blocks
<element name="card">
  <ref name="cardContent"/>
</element>
...
<define name="cardContent">
  <element name="name">
    <text/>
  </element>
  <element name="email">
    <text/>
  </element>
</define>