Search code examples
xmlxsdxsd-validationxml-validation

How to link XML file with XSD schema?


I am new to XML. Can somebody help me connect the XSD to XML file ?

Here is my XML:

<WorldWideHappiness
    xmlns="https://www.w3schools.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://www.w3schools.com/xml Hapiness.xsd">
<Record>
    <Country>
        <Name>The Netherlands</Name>
        <Region>Western Europe</Region>
        <HappinessRank>7</HappinessRank>
        <HappinessScore>7.339</HappinessScore>
        <LowerConfidenceInterval>7.284</LowerConfidenceInterval>
        <UpperConfidenceInterval>7.394</UpperConfidenceInterval>
        <Health>0.81231</Health>
    </Country>
</Record>
</WorldWideHappiness>

And here is my XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="https://www.w3schools.com" xmlns="https://www.w3schools.com">
<xs:element name="WorldWideHappiness" type="WorldWideStatistics"/>
    <xs:complexType name="WorldWideStatistics">
        <xs:sequence>
            <xs:element name="Country" type="CountryType"/>
        </xs:sequence>
    </xs:complexType>
<xs:complexType name="CountryType">
    <xs:sequence>
        <xs:element name="Name" type="xs:integer"/>
        <xs:element name="Region" type="xs:string"/>
        <xs:element name="HappinessRank" type="xs:int"/>
        <xs:element name="HappinessScore" type="xs:double"/>
        <xs:element name="LowerConfidenceInterval" type="xs:double"/>
        <xs:element name="UpperConfidenceInterval" type="xs:double"/>
        <xs:element name="Health" type="xs:double"/>
    </xs:sequence>
</xs:complexType>
</xs:schema>

Solution

  • Fixes needed include

    1. Match the namespace in the XML with the targetnamespace of the XSD (check) and one of the namespace-file pairs in xsi:schemaLocation (fix).
    2. Add elementFormDefault="qualified" to the XSD. See this answer for why.
    3. Fix Name in XML to match XSD type.

    Altogether, the following XML is valid against the following XSD:

    XML

    <WorldWideHappiness
            xmlns="https://www.w3schools.com"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="https://www.w3schools.com Hapiness.xsd">
        <Country>
            <Name>1</Name>
            <Region>Western Europe</Region>
            <HappinessRank>7</HappinessRank>
            <HappinessScore>7.339</HappinessScore>
            <LowerConfidenceInterval>7.284</LowerConfidenceInterval>
            <UpperConfidenceInterval>7.394</UpperConfidenceInterval>
            <Health>0.81231</Health>
        </Country>
    </WorldWideHappiness>
    

    XSD

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
               targetNamespace="https://www.w3schools.com"
               elementFormDefault="qualified"
               xmlns="https://www.w3schools.com">
      <xs:element name="WorldWideHappiness" type="WorldWideStatistics"/>
      <xs:complexType name="WorldWideStatistics">
        <xs:sequence>
          <xs:element name="Country" type="CountryType"/>
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="CountryType">
        <xs:sequence>
          <xs:element name="Name" type="xs:integer"/>
          <xs:element name="Region" type="xs:string"/>
          <xs:element name="HappinessRank" type="xs:int"/>
          <xs:element name="HappinessScore" type="xs:double"/>
          <xs:element name="LowerConfidenceInterval" type="xs:double"/>
          <xs:element name="UpperConfidenceInterval" type="xs:double"/>
          <xs:element name="Health" type="xs:double"/>
        </xs:sequence>
      </xs:complexType>
    </xs:schema>
    

    See also