xml_arrow/lib.rs
1#![deny(missing_docs)]
2//! Convert XML records to Arrow batches with explicit or inferred schemas.
3//!
4//! Use [`XmlBatchBuilder`] for record elements and [`XmlReader`] for documents.
5//! [`XmlReader::infer`] samples a document to infer its schema.
6//!
7//! ```
8//! # fn main() -> xml_arrow::Result<()> {
9//! use arrow_schema::DataType;
10//! use xml_arrow::{XmlBatchBuilder, XmlField, XmlSchema};
11//!
12//! let schema = XmlSchema::new(vec![
13//! XmlField::new("id", "@id", DataType::Int64, false),
14//! XmlField::new("title", "title", DataType::Utf8, true),
15//! ])?;
16//! let mut builder = XmlBatchBuilder::new(schema, 128)?;
17//! builder.append_xml(r#"<book id="7"><title>Rust</title></book>"#)?;
18//! let batch = builder.flush()?.unwrap();
19//! assert_eq!(batch.num_rows(), 1);
20//! assert_eq!(batch.num_columns(), 2);
21//! # Ok(())
22//! # }
23//! ```
24//!
25//! Nested fields:
26//!
27//! ```
28//! # fn main() -> xml_arrow::Result<()> {
29//! use arrow_schema::DataType;
30//! use xml_arrow::{XmlBatchBuilder, XmlField, XmlSchema};
31//! let schema = XmlSchema::new(vec![XmlField::list(
32//! "people", "people", false,
33//! XmlField::structure("item", "person", false, vec![
34//! XmlField::new("id", "@id", DataType::Int64, false),
35//! ]),
36//! )])?;
37//! let mut builder = XmlBatchBuilder::new(schema, 128)?;
38//! builder.append_xml(r#"<r><people><person id="1"/><person id="2"/></people></r>"#)?;
39//! assert_eq!(builder.flush()?.unwrap().num_rows(), 1);
40//! # Ok(())
41//! # }
42//! ```
43
44//! Read a document:
45//!
46//! ```
47//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
48//! use arrow_schema::DataType;
49//! use futures_util::io::Cursor;
50//! use xml_arrow::{ReaderOptions, XmlField, XmlReader, XmlSchema};
51//! let schema = XmlSchema::new(vec![
52//! XmlField::new("id", "@id", DataType::Int64, false),
53//! ])?;
54//! let mut reader = XmlReader::new(
55//! Cursor::new(b"<rows><row id='1'/><row id='2'/></rows>"),
56//! schema, "/rows/row", ReaderOptions::default(),
57//! )?;
58//! futures_executor::block_on(async {
59//! assert_eq!(reader.next_batch().await?.unwrap().num_rows(), 2);
60//! assert!(reader.next_batch().await?.is_none());
61//! xml_arrow::ReaderResult::Ok(())
62//! })?;
63//! # Ok(())
64//! # }
65//! ```
66
67mod batch;
68mod builders;
69mod error;
70mod parse;
71mod reader;
72mod schema;
73mod validation;
74
75pub use batch::XmlBatchBuilder;
76pub use error::{Error, Result};
77pub use schema::{NamespaceBinding, XmlField, XmlSchema};
78
79pub use reader::{
80 infer_records, read_records, InferenceOptions, Limit, ReadError, ReaderOptions, ReaderResult,
81 XmlReader, XmlRecord,
82};