pythonxmlodoorelaxng

How to find the root cause of "Element odoo has extra content: data"


The error message

"Element odoo has extra content: data"

may be generated if an xml file such as a view fails to validate against the RELAXNG schema file odoo/odoo/import_xml.rng. Unforunately it isn't very specific. For example, this file:

<?xml version="1.0" encoding="utf-8"?>
<odoo>
  <data>

    <record id="record_id" model="ir.ui.view">
      <field name="name">foo.bar.form</field>
      <field name="model">baz.model</field>
      <field name="arch" type="xml">
        <form string="My Form">
          <sheet>
            <group>
              <field name="my_field"/>
          </group>
          </sheet>
        </form>
      </field>
    </record>

    <act_window id="action_quux" name="My Action" res_model="baz.model" view_model="form"/>

  </data>
</odoo>

will generate the message when validated, but there is no indication that the specific problem is that view_model should be view_mode. Is there a way to get a better error message?


Solution

  • The error message, at least on Debian Linux, is produced by LXML's RelaxNG validator, which in turn relies on libxml2. We can see that xmllint, also based on libxml2, produces the same output:

    xmllint path/to/view.xml --relaxng ./odoo/odoo/import_xml.rng 
    <snip xml file content/>
    path/to/view.xml:3: element data: Relax-NG validity error : Element odoo has extra content: data
    path/to/view.xml fails to validate
    

    We can't easily change how Odoo is validating XML files, but we can install a different validator, jing, and use that to validate our file in the terminal.

    To install (on Debian-based systems):

    $ sudo apt-get install jing libbatik-java libavalon-framework-java
    

    Once installed, call it like this and review the more detailed error message (formatted for readability):

    jing ./odoo/odoo/import_xml.rng  path/to/view.xml
    
    path/to/view.xml:23:9: error: attribute "view_model" not allowed here; expected attribute
     "auto_refresh", "context", "domain", "groups", "key2", "limit", "multi", "src_model", "target", "usage",
     "view_id", "view_mode" or "view_type"
    

    Since Odoo 13, there is optional support for using the jingtrang package to generate jing's validation error messages in Odoo itself*. To enable this support, install the jingtrang module from pypi.


    * Recently I noticed that jingtrang was not initialising when called from within Odoo:

    
    2025-04-05 08:41:18,481 1137841 WARNING demo odoo.tools.convert: Error occurred during initialization of VM
    Could not allocate compressed class space: 1073741824 bytes
    

    I was able to get around this by setting this environment variable:

    
    JAVA_TOOL_OPTIONS="-Xmx100m -XX:ReservedCodeCacheSize=64m -XX:-UseCompressedClassPointers -Xss256k"
    

    based on this answer from apangin.