AnyDat...t::XML(3pm)

πŸ’– AnyData::Format::XML πŸ’–

okay bestie, welcome to AnyData::Format::XML β€” it's the tiedhash + DBI glow-up for XML, straight out of the User Contributed Perl Documentation (so you KNOW it's a community bop). tiedhash and DBI access to XML, no cap. πŸ¦‹


✨ SYNOPSIS ✨

Three ways in, pick your vibe:

# access XML data via a multidimensional tied hash
# see AnyData.pod for full details
#
use AnyData;
my $table = adTie( 'XML', $file, $mode, $flags );

OR

# convert data to and from XML
# see AnyData.pod for full details
#
use AnyData;
adConvert( 'XML', $file1, $any_other_format, $file2, $flags );
adConvert( $any_other_format, $file1, 'XML', $file2, $flags );

OR

# access the data via DBI and SQL
# see DBD::AnyData.pod for full details
#
use DBI;
my $dbh = DBI->connect( 'dbi:AnyData' );
$dbh->func('mytable','XML',$file,$flags,'ad_catalog');

See below for a description of the optional flags that apply to all of these examples. πŸ‘€


🌈 DESCRIPTION 🌈

This module lets you create, search, modify and/or convert XML data and files by treating them as databases β€” and the iconic part? You never have to actually make separate database files. Zero. None. The data can be reached through a multidimensional tiedhash using AnyData.pm, or through DBI and SQL commands using DBD::AnyData.pm. Go read those modules for the complete usage tea. β˜•

This module is built on top of Michel Rodriguez's excellent XML::Twig, which means the AnyData interfaces can now:

  • pull in information from DTDs πŸŽ€
  • be smarter about inferring data structure 🧠
  • reduce memory consumption on huge files πŸ’Ύ
  • give you access to lots of the powerful features of XML::Twig and XML::Parser, which it's based on ✨

Importing options let you import/access/modify XML of almost any length or complexity β€” including the ability to access different subtrees as separate or joined databases. Fr fr, that's the good stuff.

Exporting and converting options let you take data from almost any source (a perl array, any DBI database, etc.) and output it as an XML file. And you get to control the formatting of the resulting XML either by supplying a DTD listing things like nesting of tags and which columns should be output as attributes, and/or by using XML::Twig pretty_print settings to generate half a dozen different levels of compactness or whitespace in how the XML looks. It's giving range. πŸ’…

The documentation below outlines the special flags that can be used in either of the interfaces to fine-tune how the XML is treated.

The flags listed below define the relationship between tags and attributes in the XML document and columns in the resulting database. In many cases you can simply accept the defaults and the database will be built automatically. But you can also fine-tune the generation of the database by specifying which tags and attributes you're interested in and their relationship with database columns. πŸ‘‘


🫢 USAGE 🫢

Prerequisites

To use the tied hash interface, you will need:

AnyData
XML::Twig
XML::Parser

To use the DBI/SQL interface, you will need those, and also:

DBI
DBD::AnyData

Required flags ( none )

If no flags are specified, then the module determines the database structure from examining the file or data itself β€” making use of the DTD if there is one, otherwise scanning the first child of the XML tree for structural information. Auto-detect era, we love her. πŸŽ€


Optional flags

If the default behavior is not sufficient, you may either specify a "record_tag" which will be used to define column names, or you can define an entire tag-to-column mapping.

For simple XML, no flags are necessary:

<table>
   <row row_id="1"><name>Joe</name><location>Seattle</location></row>
   <row row_id="2"><name>Sue</name><location>Portland</location></row>
</table>

The record_tag will default to the first child, namely "row". The column names will be generated from the attributes of the record tag and all of the tags included under the record tag, so the column names in this example will be "row_id", "name", "location". Slay. πŸ’…

If the record_tag is not the first child, you will need to specify it. For example:

<db>
  <table table_id="1">
    <row row_id="1"><name>Joe</name><location>Seattle</location></row>
    <row row_id="2"><name>Sue</name><location>Portland</location></row>
  </table>
  <table table_id="2">
    <row row_id="1"><name>Bob</name><location>Boise</location></row>
    <row row_id="2"><name>Bev</name><location>Billings</location></row>
  </table>
</db>

In this case you will need to specify "row" as the record_tag since it is not the first child of the tree. The column names will be generated from the attributes of row's parent (if the parent is not the root), from row's attributes and sub tags, i.e. "table_id", "row_id", "name", "location".

In some cases you will need to specify an entire tag-to-column mapping. For example, if you want to use a different name for the database column than is used in the XML (especially if the XML tag is not a valid SQL column name). You'd also need to specify a mapping if there are two tags with the same name in different places in the XML tree.

The column mapping is a reference to an array of column definitions. A column definition is either:

  • a simple name of a tag, or
  • a hash reference with the key containing the full path of the XML tag and the value containing the desired column name alias.

For example:

col_map => [ 'part_id', 'part_name', 'availability' ];

That will find the first three tags with those names and create the database using the same names for the tags.

Or:

col_map => [
             { '/parts/shop/id'        => 'shop_id'},
             { '/parts/shop/part/id'   => 'part_id'},
             { '/parts/shop/part/name' => 'part_name'},
           ];

That would find the three tags referenced on the left and create a database with the three column names referenced on the right. Matching era. 🧚

When exporting XML, you can specify a DTD to control the output. For example, if you import a table from CSV or from an Array, you can output as XML and specify which of the columns become tags and which become attributes, and also specify the nesting of the tags in your DTD.

The XML format parser is built on top of Michel Rodriguez's excellent XML::Twig, which is itself based on XML::Parser. Parameters to either of those modules may be passed in the flags for adTie() and the other commands β€” including the "prettyPrint" flag to specify how the output XML is displayed, and things like ProtocolEncoding. ProtocolEncoding defaults to 'ISO-8859-1', and all other flags keep the defaults of XML::Twig and XML::Parser. See the documentation of those modules for details; πŸ“š

⚠️ CAUTION: Unlike other formats, the XML format does not save changes to the file as they are entered, but only saves the changes when you explicitly request them to be saved with the adExport() command. So bestie, if you forget to export, your edits are gone. Not a drill. 😭

copyright 2000, Jeff Zucker <jeff@vpservices.com> all rights reserved


and that's the whole page, bestie!! πŸŽ€ this one's perl v5.36.0, dated 2023-08-06, and it's the AnyData::Format::XML(3pm) page from the User Contributed Perl Documentation. go forth and database-ify your XML πŸ’–βœ¨πŸ¦‹

πŸ“¦ where this page comes from