2

I'm getting the following error whilst trying to validate an XML document based on the Google Atom feed.

Error - Line 8, 10: org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 10; cvc-complex-type.2.4.a: Invalid content was found starting with element 'g:brand'. One of '{"xxx..w3.org/2005/Atom":id, "xxx.w3.org/2005/Atom":title, ".w3.org/2005/Atom":link, "xxx.w3.org/2005/Atom":brand}' is expected.

Here is my XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <feed xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">
        <title>The name of your data feed.</title>
        <link rel="self" href="http://www.example.com"/>
        <updated>2006-06-11T18:30:02Z</updated>
    <entry>
    <title>Red wool sweater</title>
    <g:brand>Acme</g:brand>
    <g:condition>new</g:condition>
    <summary>Comfortable and soft, this sweater will keep you warm on those cold winter nights.</summary>
    <id>1</id>
    <g:image_link>http://www.example.com/image1.jpg</g:image_link>
    <link href="http://www.example.com/item1-info-page.html"/>
    <g:mpn>ABC123</g:mpn>
    <g:price>25</g:price>
    <g:product_type>Clothing &amp; Accessories &gt; Clothing &gt; Outerwear &gt; Sweaters</g:product_type>
    <g:quantity>3</g:quantity>
    <g:shipping>
       <g:country>US</g:country>
       <g:region>MA</g:region>
       <g:service>Ground</g:service>
       <g:price>5.95</g:price>
    </g:shipping>
    <g:shipping>
       <g:country>US</g:country>
       <g:region>024*</g:region>
       <g:service>Ground</g:service>
       <g:price>7.95</g:price>
    </g:shipping>
    <g:tax>
       <g:country>US</g:country>
       <g:region>CA</g:region>
       <g:rate>8.25</g:rate>
       <g:tax_ship>y</g:tax_ship>
    </g:tax>
    <g:tax>
       <g:country>US</g:country>
       <g:region>926*</g:region>
       <g:rate>8.75</g:rate>
       <g:tax_ship>y</g:tax_ship>
    </g:tax>
    <g:upc>0001230001232</g:upc>
    <g:weight>0.1 lb</g:weight>
    </entry>
    </feed>

And here is my XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.w3.org/2005/Atom"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           xmlns:atom="http://www.w3.org/2005/Atom"
           xmlns:g="http://base.google.com/ns/1.0"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import namespace="http://www.w3.org/XML/1998/namespace"
             schemaLocation="http://www.w3.org/2001/03/xml.xsd"/>
  <xs:element name="feed" type="atom:feedType"/>
  <xs:element name="entry" type="atom:entryType"/>
  <xs:element name="extended_attribute" type="atom:extendedAttributeType"/>
  <xs:complexType name="textType" mixed="true">
    <xs:sequence>
      <xs:any namespace="http://www.w3.org/1999/xhtml" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="type">
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:enumeration value="text"/>
          <xs:enumeration value="html"/>
          <xs:enumeration value="xhtml"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attributeGroup ref="atom:commonAttributes"/>
  </xs:complexType>
  <xs:complexType name="idType">
    <xs:simpleContent>
      <xs:extension base="xs:anyURI">
        <xs:attributeGroup ref="atom:commonAttributes"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="feedType">
    <xs:choice minOccurs="3" maxOccurs="unbounded">
      <xs:element name="link" type="atom:linkType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="title" type="atom:textType" minOccurs="1" maxOccurs="1"/>
      <xs:element name="updated" type="atom:dateTimeType" minOccurs="1" maxOccurs="1"/>
      <xs:element name="entry" type="atom:entryType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
    </xs:choice>
    <xs:attributeGroup ref="atom:commonAttributes"/>
  </xs:complexType>
  <xs:complexType name="extendedAttributeType">
    <xs:choice  maxOccurs="unbounded">
      <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"/>
      <xs:element name="value" type="xs:string" minOccurs="1" maxOccurs="1"/>
    </xs:choice>
    <xs:attributeGroup ref="atom:commonAttributes"/>
  </xs:complexType>
  <xs:complexType name="entryType">
    <xs:choice maxOccurs="unbounded">
      <xs:element name="id" type="atom:idType" minOccurs="1" maxOccurs="1"/>
      <xs:element name="title" type="atom:textType" minOccurs="1" maxOccurs="1"/>
      <xs:element name="link" type="atom:linkType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="brand" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
    </xs:choice>
    <xs:attributeGroup ref="atom:commonAttributes"/>
  </xs:complexType>

  <xs:complexType name="linkType" mixed="true">
    <xs:attribute name="href" use="required" type="xs:anyURI"/>
    <xs:attribute name="rel" type="xs:string" use="optional"/>
    <xs:attribute name="type" use="optional" type="xs:string"/>
    <xs:attribute name="hreflang" use="optional" type="xs:NMTOKEN"/>
    <xs:attribute name="title" use="optional" type="xs:string"/>
    <xs:attribute name="length" use="optional" type="xs:positiveInteger"/>
    <xs:attributeGroup ref="atom:commonAttributes"/>
  </xs:complexType>

  <xs:complexType name="dateTimeType">
    <xs:simpleContent>
      <xs:extension base="xs:dateTime">
        <xs:attributeGroup ref="atom:commonAttributes"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:attributeGroup name="commonAttributes">
    <xs:attribute ref="xml:base"/>
    <xs:attribute ref="xml:lang"/>
    <xs:anyAttribute namespace="##other"/>
  </xs:attributeGroup>
</xs:schema>

I'm guessing the error has to do with my namespace declared in the XML (xmlns:g="http://base.google.com/ns/1.0"). I have entered this in the targetNamespace of the XSD, but I cannot get it to work.

kjhughes
  • 106,133
  • 27
  • 181
  • 240
mark
  • 23
  • 1
  • 4

2 Answers2

2

Atom 1.0 XSD

The Atom Syndication Format is an establish standard with an existing XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.w3.org/2005/Atom"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           xmlns:atom="http://www.w3.org/2005/Atom"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:annotation>
    <xs:documentation>
      This version of the Atom schema is based on version 1.0 of the format specifications,
      found here http://www.atomenabled.org/developers/syndication/atom-format-spec.php.
    </xs:documentation>
  </xs:annotation>
  <xs:import namespace="http://www.w3.org/XML/1998/namespace"
             schemaLocation="http://www.w3.org/2001/03/xml.xsd"/>
  <xs:annotation>
    <xs:documentation>
      An Atom document may have two root elements, feed and entry, as defined in section 2.
    </xs:documentation>
  </xs:annotation>
  <xs:element name="feed" type="atom:feedType"/>
  <xs:element name="entry" type="atom:entryType"/>
  <xs:complexType name="textType" mixed="true">
    <xs:annotation>
      <xs:documentation>
        The Atom text construct is defined in section 3.1 of the format spec.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:any namespace="http://www.w3.org/1999/xhtml" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="type">
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:enumeration value="text"/>
          <xs:enumeration value="html"/>
          <xs:enumeration value="xhtml"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attributeGroup ref="atom:commonAttributes"/>
  </xs:complexType>
  <xs:complexType name="personType">
    <xs:annotation>
      <xs:documentation>
        The Atom person construct is defined in section 3.2 of the format spec.
      </xs:documentation>
    </xs:annotation>
    <xs:choice minOccurs="1" maxOccurs="unbounded">
      <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"/>
      <xs:element name="uri" type="atom:uriType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="email" type="atom:emailType" minOccurs="0" maxOccurs="1"/>
      <xs:any namespace="##other"/>
    </xs:choice>
    <xs:attributeGroup ref="atom:commonAttributes"/>
  </xs:complexType>
  <xs:simpleType name="emailType">
    <xs:annotation>
      <xs:documentation>
        Schema definition for an email address.
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:normalizedString">
      <xs:pattern value="\w+@(\w+\.)+\w+"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="feedType">
    <xs:annotation>
      <xs:documentation>
        The Atom feed construct is defined in section 4.1.1 of the format spec.
      </xs:documentation>
    </xs:annotation>
    <xs:choice minOccurs="3" maxOccurs="unbounded">
      <xs:element name="author" type="atom:personType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="category" type="atom:categoryType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="contributor" type="atom:personType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="generator" type="atom:generatorType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="icon" type="atom:iconType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="id" type="atom:idType" minOccurs="1" maxOccurs="1"/>
      <xs:element name="link" type="atom:linkType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="logo" type="atom:logoType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="rights" type="atom:textType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="subtitle" type="atom:textType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="title" type="atom:textType" minOccurs="1" maxOccurs="1"/>
      <xs:element name="updated" type="atom:dateTimeType" minOccurs="1" maxOccurs="1"/>
      <xs:element name="entry" type="atom:entryType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
    </xs:choice>
    <xs:attributeGroup ref="atom:commonAttributes"/>
  </xs:complexType>
  <xs:complexType name="entryType">
    <xs:annotation>
      <xs:documentation>
        The Atom entry construct is defined in section 4.1.2 of the format spec.
      </xs:documentation>
    </xs:annotation>
    <xs:choice maxOccurs="unbounded">
      <xs:element name="author" type="atom:personType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="category" type="atom:categoryType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="content" type="atom:contentType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="contributor" type="atom:personType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="id" type="atom:idType" minOccurs="1" maxOccurs="1"/>
      <xs:element name="link" type="atom:linkType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="published" type="atom:dateTimeType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="rights" type="atom:textType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="source" type="atom:sourceType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="summary" type="atom:textType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="title" type="atom:textType" minOccurs="1" maxOccurs="1"/>
      <xs:element name="updated" type="atom:dateTimeType" minOccurs="1" maxOccurs="1"/>
      <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
    </xs:choice>
    <xs:attributeGroup ref="atom:commonAttributes"/>
  </xs:complexType>
  <xs:complexType name="contentType" mixed="true">
    <xs:annotation>
      <xs:documentation>
        The Atom content construct is defined in section 4.1.3 of the format spec.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="type" type="xs:string"/>
    <xs:attribute name="src" type="xs:anyURI"/>
    <xs:attributeGroup ref="atom:commonAttributes"/>
  </xs:complexType>
  <xs:complexType name="categoryType">
    <xs:annotation>
      <xs:documentation>
        The Atom cagegory construct is defined in section 4.2.2 of the format spec.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="term" type="xs:string" use="required"/>
    <xs:attribute name="scheme" type="xs:anyURI" use="optional"/>
    <xs:attribute name="label" type="xs:string" use="optional"/>
    <xs:attributeGroup ref="atom:commonAttributes"/>
  </xs:complexType>
  <xs:complexType name="generatorType">
    <xs:annotation>
      <xs:documentation>
        The Atom generator element is defined in section 4.2.4 of the format spec.
      </xs:documentation>
    </xs:annotation>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="uri" use="optional" type="xs:anyURI"/>
        <xs:attribute name="version" use="optional" type="xs:string"/>
        <xs:attributeGroup ref="atom:commonAttributes"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="iconType">
    <xs:annotation>
      <xs:documentation>
        The Atom icon construct is defined in section 4.2.5 of the format spec.
      </xs:documentation>
    </xs:annotation>
    <xs:simpleContent>
      <xs:extension base="xs:anyURI">
        <xs:attributeGroup ref="atom:commonAttributes"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="idType">
    <xs:annotation>
      <xs:documentation>
        The Atom id construct is defined in section 4.2.6 of the format spec.
      </xs:documentation>
    </xs:annotation>
    <xs:simpleContent>
      <xs:extension base="xs:anyURI">
        <xs:attributeGroup ref="atom:commonAttributes"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="linkType" mixed="true">
    <xs:annotation>
      <xs:documentation>
        The Atom link construct is defined in section 3.4 of the format spec.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="href" use="required" type="xs:anyURI"/>
    <xs:attribute name="rel" type="xs:string" use="optional"/>
    <xs:attribute name="type" use="optional" type="xs:string"/>
    <xs:attribute name="hreflang" use="optional" type="xs:NMTOKEN"/>
    <xs:attribute name="title" use="optional" type="xs:string"/>
    <xs:attribute name="length" use="optional" type="xs:positiveInteger"/>
    <xs:attributeGroup ref="atom:commonAttributes"/>
  </xs:complexType>
  <xs:complexType name="logoType">
    <xs:annotation>
      <xs:documentation>
        The Atom logo construct is defined in section 4.2.8 of the format spec.
      </xs:documentation>
    </xs:annotation>
    <xs:simpleContent>
      <xs:extension base="xs:anyURI">
        <xs:attributeGroup ref="atom:commonAttributes"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="sourceType">
    <xs:annotation>
      <xs:documentation>
        The Atom source construct is defined in section 4.2.11 of the format spec.
      </xs:documentation>
    </xs:annotation>
    <xs:choice maxOccurs="unbounded">
      <xs:element name="author" type="atom:personType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="category" type="atom:categoryType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="contributor" type="atom:personType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="generator" type="atom:generatorType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="icon" type="atom:iconType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="id" type="atom:idType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="link" type="atom:linkType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="logo" type="atom:logoType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="rights" type="atom:textType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="subtitle" type="atom:textType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="title" type="atom:textType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="updated" type="atom:dateTimeType" minOccurs="0" maxOccurs="1"/>
      <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
    </xs:choice>
    <xs:attributeGroup ref="atom:commonAttributes"/>
  </xs:complexType>
  <xs:complexType name="uriType">
    <xs:simpleContent>
      <xs:extension base="xs:anyURI">
        <xs:attributeGroup ref="atom:commonAttributes"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="dateTimeType">
    <xs:simpleContent>
      <xs:extension base="xs:dateTime">
        <xs:attributeGroup ref="atom:commonAttributes"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:attributeGroup name="commonAttributes">
    <xs:attribute ref="xml:base"/>
    <xs:attribute ref="xml:lang"/>
    <xs:anyAttribute namespace="##other"/>
  </xs:attributeGroup>
</xs:schema>

However, using even this XSD to validate your XML still results in errors such as the following:

[Error] feed.xml:12:14: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'g:brand'.

Google Base Namespace

To eliminate the errors related to the http://base.google.com/ns/1.0 Google Base namespace extensions, you have two options:

  1. Import the Google Base XSD into the Atom XSD:

    <xs:import namespace="http://base.google.com/ns/1.0"
               schemaLocation="base-google.xsd"/>
    

    The challenges here are (a) the XSD associated with the http://base.google.com/ns/1.0 namespace does not appear to live at a well-known, official location and (b) the XSD may not be being maintained. I found one here. [If anyone knows a more official or more up-to-date Google Base XSD, please comment and I'll update the link.]

  2. Loosen xsd:any/@processContents="strict" (the default) to lax. (For the difference, see processContents strict vs lax vs skip for xsd:any.)

Which route you go will depend upon how much validation you wish to do on the Google elements falling under xsd:any. The first route will provide stricter validation, but your next problem will be that you'll have to change the XML or the XSD to fix further errors such as no declaration for g:mpn. The second route will blissfully ignore such errors.

Community
  • 1
  • 1
kjhughes
  • 106,133
  • 27
  • 181
  • 240
  • Magic thank you for your response. I'm away for a week but will make. The changes when I get back – mark Feb 15 '15 at 16:49
  • if i add the processcontents lax then none of my validation works so i have removed this and added the import of the google atom namespace but now i get the following error Error - Line 13, 25: org.xml.sax.SAXParseException; lineNumber: 13; columnNumber: 25; cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'g:availability'. so as availability is not declared in the atom import how do i declare it locally or with no name space?? – mark Feb 26 '15 at 12:24
  • Ideally you'd use an up-to-date, fully maintained XSD for the `http://base.google.com/ns/1.0` namespace. Short of that, I'd either directly update the one you have in place or get fancier and extend it. Since you know that your XML is correct and the XSD is out-of-date, directly editing the XSD (and possibly making it publicly available should others want to use it) wouldn't be a bad option. – kjhughes Feb 26 '15 at 12:53
0

I could not find XSD anywhere but the Google has the feed specification here: https://support.google.com/merchants/answer/7052112

It's not XSD thou.

Paweł Szczur
  • 5,484
  • 3
  • 29
  • 32