use xmlschema::{parse_schema, validate};
const SCHEMA: &str = r#"<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="order">
<xs:complexType>
<xs:sequence>
<xs:element name="customer" type="xs:string"/>
<xs:element name="line" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="sku" type="xs:string"/>
<xs:element name="qty" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>"#;
const VALID: &str = r#"<order id="A-1">
<customer>Ada</customer>
<line><sku>ABC</sku><qty>2</qty></line>
<line><sku>DEF</sku><qty>1</qty></line>
</order>"#;
const INVALID: &str = r"<order>
<line><qty>many</qty><sku>ABC</sku></line>
<customer>Ada</customer>
</order>";
fn main() -> Result<(), Box<dyn std::error::Error>> {
let schema = parse_schema(SCHEMA)?;
println!("== a conforming document ==");
let doc = oxml::parse(VALID)?;
let report = validate(&doc, &schema);
println!(" valid: {}", report.is_valid());
assert!(report.is_valid(), "the document conforms");
println!("\n== a document with several problems ==");
let doc = oxml::parse(INVALID)?;
let report = validate(&doc, &schema);
println!(" valid: {}", report.is_valid());
assert!(!report.is_valid());
for violation in &report.violations {
println!(" {}: {}", violation.path, violation.message);
}
assert!(
report.violations.len() > 1,
"every violation, not only the first"
);
println!("\n== a schema that does not parse ==");
match parse_schema("<xs:schema") {
Ok(_) => println!(" unexpectedly parsed"),
Err(e) => println!(" {e}"),
}
Ok(())
}