flxzt/rnote · error

Failed to parse `domain` attribute in XoppBackground with…

Error message

Failed to parse `domain` attribute in XoppBackground with node id {:?}, could not find attribute

What it means

For a pixmap XoppBackground, the 'domain' attribute is required and must be one of absolute, attach, or clone. Missing attribute yields this error; a present-but-unknown value yields a sibling error at line 398.

Solutions

  1. Add domain="absolute" (or "attach"/"clone") to the pixmap background element
  2. Re-save the file in Xournal++ to regenerate the attribute
  3. Verify the attribute spelling is exactly one of absolute|attach|clone
  4. Use the same domain value the original file's embedded pixmap expects

Example fix

// before
<background type="pixmap" filename="bg.png"/>
// after
<background type="pixmap" domain="absolute" filename="bg.png"/>
Defensive patterns

Strategy: validation

Validate before calling

fn pixmap_bg_has_domain(node: &roxmltree::Node) -> bool {
    matches!(node.attribute("domain"), Some("absolute") | Some("attach") | Some("clone"))
}

Try / catch

let domain = node.attribute("domain").unwrap_or("absolute"); // or fail fast
match domain {
    "absolute" | "attach" | "clone" => {},
    other => bail!("unknown pixmap domain: {}", other),
}

Prevention

When it happens

Trigger: load_from_xml on a <background type="pixmap"> node without 'domain', seen with hand-edited or tool-generated XML that omits it.

Common situations: Manually constructing pixmap backgrounds; stripping attributes when cleaning XML; older exporter versions omitting domain.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


AI-assisted analysis of flxzt/rnote@bbc5354502 (2026-09-08). Data as JSON: /api/errors/9b8ccfea9ca4ad57. Report an issue: GitHub.

Appendix: source

Thrown at crates/rnote-engine/src/fileformats/xoppformat.rs:392

                    Err(e) => {
                        error!("Failed to retrieve the XoppBackgroundSolidStyle from `style` attribute, Err: {e:?}");
                        XoppBackgroundSolidStyle::Plain
                    }
                };

                let color = XoppColor::from_backgroundcolor_attr_value(
                    node.attribute("color").ok_or_else(|| {
                        anyhow::anyhow!(
                            "Failed to parse `color` attribute in XoppBackground with id {:?}",
                            node.id()
                        )
                    })?,
                )?;
                self.bg_type = XoppBackgroundType::Solid { color, style };
            }
            "pixmap" => {
                let domain = match node.attribute("domain").ok_or_else(|| {
                    anyhow::anyhow!("Failed to parse `domain` attribute in XoppBackground with node id {:?}, could not find attribute", node.id())
                })? {
                    "absolute" => XoppBackgroundPixmapDomain::Absolute,
                    "attach" => XoppBackgroundPixmapDomain::Attach,
                    "clone" => XoppBackgroundPixmapDomain::Clone,
                    _ => {
                        return Err(anyhow::anyhow!("Err while parsing `style` attribute of XoppBackground with node id {:?}, is not a valid value", node.id()));
                    }
                };
                let filename = node
                    .attribute("filename")
                    .ok_or_else(|| {
                        anyhow::anyhow!("Failed to parse `filename` attribute in XoppBackground with node id {:?}, could not find attribute", node.id())
                    })?
                    .to_string();
                self.bg_type = XoppBackgroundType::Pixmap { domain, filename };
            }
            "pdf" => {
                self.bg_type = XoppBackgroundType::Pdf;

View on GitHub (pinned to bbc5354502)