xso: discard xml:lang implicitly

Because this attribute may occur in random places, it makes no sense
failing on it. We discard it after attribute processing though, so it
can still be captured by structs which are explicitly interested in it.
This commit is contained in:
Jonas Schäfer 2025-04-18 19:42:42 +02:00
commit 31d7bbf622
3 changed files with 27 additions and 1 deletions

View file

@ -139,6 +139,23 @@ fn empty_unexpected_attribute() {
}
}
#[test]
#[cfg_attr(
feature = "disable-validation",
should_panic = "unexpected result: Ok("
)]
fn empty_ignores_xml_lang() {
#[allow(unused_imports)]
use core::{
option::Option::{None, Some},
result::Result::{Err, Ok},
};
match parse_str::<Empty>("<foo xmlns='urn:example:ns1' xml:lang='bar'/>") {
Ok(Empty) => (),
other => panic!("unexpected result: {:?}", other),
}
}
#[test]
#[cfg_attr(
feature = "disable-validation",

View file

@ -396,7 +396,11 @@ impl Compound {
}
}
let mut discard_attr = TokenStream::default();
// We always implicitly discard the `xml:lang` attribute. Its
// processing is handled using the `#[xml(language)]` meta.
let mut discard_attr = quote! {
let _ = #attrs.remove(::xso::exports::rxml::Namespace::xml(), "lang");
};
for (xml_namespace, xml_name) in self.discard_attr.iter() {
let xml_namespace = match xml_namespace {
Some(v) => v.to_token_stream(),

View file

@ -12,6 +12,11 @@ Version NEXT:
This change overall allows for more flexibility in the implementation
of text codecs.
- `xml:lang` attributes are now silently discarded during
deserialisation unless captured by `#[xml(attribute = "xml:lang")]` or
equivalent. This is because `xml:lang` is special as per
XML 1.0 § 2.12 and it is generally preferable to allow it to occur
anywhere in the document.
* Added
- Support for child elements in derive macros. Child elements may also
be wrapped in Option or Box or in containers like Vec or HashSet.