RDF/XML: avoids to serialize special XML namespaces

pull/670/head
Tpt 12 months ago committed by Thomas Tanon
parent ddf589ea14
commit 98caee8f92
  1. 39
      lib/oxrdfxml/src/serializer.rs

@ -2,6 +2,7 @@ use crate::utils::*;
use oxrdf::{Subject, SubjectRef, TermRef, TripleRef}; use oxrdf::{Subject, SubjectRef, TermRef, TripleRef};
use quick_xml::events::*; use quick_xml::events::*;
use quick_xml::Writer; use quick_xml::Writer;
use std::borrow::Cow;
use std::io; use std::io;
use std::io::Write; use std::io::Write;
use std::sync::Arc; use std::sync::Arc;
@ -21,7 +22,7 @@ use tokio::io::AsyncWrite;
/// NamedNodeRef::new("http://schema.org/Person")?, /// NamedNodeRef::new("http://schema.org/Person")?,
/// ))?; /// ))?;
/// assert_eq!( /// assert_eq!(
/// b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\t<rdf:Description rdf:about=\"http://example.com#me\">\n\t\t<type xmlns=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" rdf:resource=\"http://schema.org/Person\"/>\n\t</rdf:Description>\n</rdf:RDF>", /// b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\t<rdf:Description rdf:about=\"http://example.com#me\">\n\t\t<rdf:type rdf:resource=\"http://schema.org/Person\"/>\n\t</rdf:Description>\n</rdf:RDF>",
/// writer.finish()?.as_slice() /// writer.finish()?.as_slice()
/// ); /// );
/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) /// # Result::<_,Box<dyn std::error::Error>>::Ok(())
@ -52,7 +53,7 @@ impl RdfXmlSerializer {
/// NamedNodeRef::new("http://schema.org/Person")?, /// NamedNodeRef::new("http://schema.org/Person")?,
/// ))?; /// ))?;
/// assert_eq!( /// assert_eq!(
/// b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\t<rdf:Description rdf:about=\"http://example.com#me\">\n\t\t<type xmlns=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" rdf:resource=\"http://schema.org/Person\"/>\n\t</rdf:Description>\n</rdf:RDF>", /// b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\t<rdf:Description rdf:about=\"http://example.com#me\">\n\t\t<rdf:type rdf:resource=\"http://schema.org/Person\"/>\n\t</rdf:Description>\n</rdf:RDF>",
/// writer.finish()?.as_slice() /// writer.finish()?.as_slice()
/// ); /// );
/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) /// # Result::<_,Box<dyn std::error::Error>>::Ok(())
@ -84,7 +85,7 @@ impl RdfXmlSerializer {
/// NamedNodeRef::new_unchecked("http://schema.org/Person"), /// NamedNodeRef::new_unchecked("http://schema.org/Person"),
/// )).await?; /// )).await?;
/// assert_eq!( /// assert_eq!(
/// b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\t<rdf:Description rdf:about=\"http://example.com#me\">\n\t\t<type xmlns=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" rdf:resource=\"http://schema.org/Person\"/>\n\t</rdf:Description>\n</rdf:RDF>", /// b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\t<rdf:Description rdf:about=\"http://example.com#me\">\n\t\t<rdf:type rdf:resource=\"http://schema.org/Person\"/>\n\t</rdf:Description>\n</rdf:RDF>",
/// writer.finish().await?.as_slice() /// writer.finish().await?.as_slice()
/// ); /// );
/// # Ok(()) /// # Ok(())
@ -118,7 +119,7 @@ impl RdfXmlSerializer {
/// NamedNodeRef::new("http://schema.org/Person")?, /// NamedNodeRef::new("http://schema.org/Person")?,
/// ))?; /// ))?;
/// assert_eq!( /// assert_eq!(
/// b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\t<rdf:Description rdf:about=\"http://example.com#me\">\n\t\t<type xmlns=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" rdf:resource=\"http://schema.org/Person\"/>\n\t</rdf:Description>\n</rdf:RDF>", /// b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\t<rdf:Description rdf:about=\"http://example.com#me\">\n\t\t<rdf:type rdf:resource=\"http://schema.org/Person\"/>\n\t</rdf:Description>\n</rdf:RDF>",
/// writer.finish()?.as_slice() /// writer.finish()?.as_slice()
/// ); /// );
/// # Result::<_,Box<dyn std::error::Error>>::Ok(()) /// # Result::<_,Box<dyn std::error::Error>>::Ok(())
@ -253,13 +254,29 @@ impl InnerRdfXmlWriter {
self.current_subject = Some(triple.subject.into_owned()); self.current_subject = Some(triple.subject.into_owned());
let (prop_prefix, prop_value) = split_iri(triple.predicate.as_str()); let (prop_prefix, prop_value) = split_iri(triple.predicate.as_str());
let (prop_qname, prop_xmlns) = if prop_value.is_empty() { let (prop_qname, prop_xmlns) =
("prop:", ("xmlns:prop", prop_prefix)) if prop_prefix == "http://www.w3.org/1999/02/22-rdf-syntax-ns#" {
} else { (Cow::Owned(format!("rdf:{prop_value}")), None)
(prop_value, ("xmlns", prop_prefix)) } else if prop_prefix == "http://www.w3.org/2000/xmlns/" {
}; if prop_value.is_empty() {
let mut property_open = BytesStart::new(prop_qname); return Err(io::Error::new(
property_open.push_attribute(prop_xmlns); io::ErrorKind::InvalidInput,
"The http://www.w3.org/2000/xmlns/ predicate IRI is not allowed in XML",
));
}
(
Cow::Borrowed("p:"),
Some(("xmlns:p", triple.predicate.as_str())),
)
} else if prop_value.is_empty() {
(Cow::Borrowed("p:"), Some(("xmlns:p", prop_prefix)))
} else {
(Cow::Borrowed(prop_value), Some(("xmlns", prop_prefix)))
};
let mut property_open = BytesStart::new(prop_qname.clone());
if let Some(prop_xmlns) = prop_xmlns {
property_open.push_attribute(prop_xmlns);
}
let content = match triple.object { let content = match triple.object {
TermRef::NamedNode(node) => { TermRef::NamedNode(node) => {
property_open.push_attribute(("rdf:resource", node.as_str())); property_open.push_attribute(("rdf:resource", node.as_str()));

Loading…
Cancel
Save