{"id":679,"date":"2025-01-17T07:30:00","date_gmt":"2025-01-17T07:30:00","guid":{"rendered":"https:\/\/datablog.roman-halliday.com\/?p=679"},"modified":"2025-01-17T07:46:52","modified_gmt":"2025-01-17T07:46:52","slug":"data-loading-with-the-help-of-ai","status":"publish","type":"post","link":"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/","title":{"rendered":"Data loading, with the help of AI"},"content":{"rendered":"\n<p>In today&#8217;s fast-paced development world, efficiency is paramount. AI can significantly accelerate the coding process, including the creation of scripts to interact with various data formats. This blog post will explore how to use AI assistance to generate Python code for loading a custom XML file.<\/p>\n\n\n\n<p>This is a use case for those of us who work with data, that we can use to solve challenges which we have in development. While it&#8217;s a specific example, the approach is very re-usable and can be applied to many sources and databases.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Using AI to parse an XML file and create python code to load it to a MySQL database<\/h2>\n\n\n\n<p>For the sake of simplicity, and what&#8217;s going to be familiar to most data engineers (including open source software), I&#8217;m using an XML file I found, and coding in python loading to a MySQL database.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What is XML?<\/h3>\n\n\n\n<p>For anyone who isn&#8217;t so familiar with it (most technologies use json now) <strong>XML <\/strong>(Extensible Markup Language) is a simple, text-based format for representing structured data. It&#8217;s like a universal language that computers and humans can both understand. &nbsp;<\/p>\n\n\n\n<p><strong>Here&#8217;s a breakdown:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Structure:<\/strong> XML uses tags (like <code>&lt;name&gt;<\/code>, <code>&lt;age&gt;<\/code>) to define the structure and meaning of the data.<\/li>\n\n\n\n<li><strong>Data:<\/strong> The actual information is placed within these tags. &nbsp;<\/li>\n\n\n\n<li><strong>Flexibility:<\/strong> You can create your own custom tags, making it adaptable to various data types and structures. <\/li>\n<\/ul>\n\n\n\n<p>A simple sample example is:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;person>\n  &lt;name>John Doe&lt;\/name>\n  &lt;age>30&lt;\/age>\n  &lt;city>New York&lt;\/city>\n&lt;\/person><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">My (more complicated) XML file<\/h3>\n\n\n\n<p>For this example, I&#8217;ve found an XML file which contains nested structured data. We can envisage having a collection of these files which we have to understand and load into a format which is usable for data consumption (cut down example below, full file can be seen on <a href=\"https:\/\/github.com\/d-roman-halliday\/ai-generated-xml-to-mysql-loader\/blob\/main\/ACNV_V03D01D_R1.xml\">my github<\/a>).<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\n&lt;product id=\"Animated Canvases\" name=\"Animated Canvases\" version=\"1\" singlecontent=\"true\">\n&lt;volume id=\"Animated Canvases Collection 3\" name=\"Animated Canvases Collection 3\" number=\"3\" sourcefiletype=\"mov\" preview_discid=\"ACNV_V03D01D_R1\" preview_suffix=\".mov\" preview_install_dir=\"Juicer3\" preview_path_on_disc=\"Juicer3\/\" preview_thumbnail_suffix=\".jpg\" install_size_img=\"1\" install_size_img_mov=\"10\" totalPreviewSize=\"185\" totalSourceSize=\"14464.62\" baseJ3Version=\"3.03 Build 258\">\n&lt;disc id=\"ACNV_V03D01D_R1\" number=\"1\">\n&lt;parent id=\"Source\">\n&lt;content id=\"All Star_HD\" type=\"1\" name=\"\" originalfps=\"30\" frames=\"300\" description=\"Animated Background\" resolution=\"hd\" resx=\"1920\" resy=\"1080\" base=\"\">&lt;keywords>&lt;\/keywords>&lt;\/content>\n&lt;content id=\"Amber Rays_HD\" type=\"1\" name=\"\" originalfps=\"30\" frames=\"300\" description=\"Animated Background\" resolution=\"hd\" resx=\"1920\" resy=\"1080\" base=\"\">&lt;keywords>&lt;\/keywords>&lt;\/content>\n&lt;content id=\"Approaching Doom_HD\" type=\"1\" name=\"\" originalfps=\"30\" frames=\"600\" description=\"Animated Background\" resolution=\"hd\" resx=\"1920\" resy=\"1080\" base=\"\">&lt;keywords>&lt;\/keywords>&lt;\/content>\n&lt;\/parent>\n&lt;\/disc>\n&lt;disc id=\"ACNV_V03D02D_R1\" number=\"2\">\n&lt;parent id=\"Source\">\n&lt;content id=\"Hiding Magic_HD\" type=\"1\" name=\"\" originalfps=\"30\" frames=\"300\" description=\"Animated Background\" resolution=\"hd\" resx=\"1920\" resy=\"1080\" base=\"\">&lt;keywords>&lt;\/keywords>&lt;\/content>\n&lt;content id=\"Higher Than The Sky_HD\" type=\"1\" name=\"\" originalfps=\"30\" frames=\"450\" description=\"Animated Background\" resolution=\"hd\" resx=\"1920\" resy=\"1080\" base=\"\">&lt;keywords>&lt;\/keywords>&lt;\/content>\n&lt;\/parent>\n&lt;\/disc>\n&lt;\/volume>\n&lt;\/product><\/pre>\n\n\n\n<p>Historically I&#8217;d use a local text editor (with syntax highlighting) to explore the file and work out what objects are in it, or an online equivalent such as: <a href=\"https:\/\/jsonformatter.org\/xml-formatter\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/jsonformatter.org\/xml-formatter<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Using AI<\/h2>\n\n\n\n<p>In this case, I&#8217;m using <a href=\"https:\/\/chatgpt.com\" target=\"_blank\" rel=\"noreferrer noopener\">ChatGPT<\/a> to speed up my process. You can see the whole conversation <a href=\"https:\/\/chatgpt.com\/share\/6789fddb-3744-8012-be10-8f51ab354be3\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a> (the relevant parts are copied below).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Viewing the structure and content of the file<\/h3>\n\n\n\n<p>Yes, XML is very human readable, with indentation it&#8217;s even clearer what the hierarchy is. But asking AI to do some of this is even more readable.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Describe the hierarchy of data structures in the attached XML file<\/p>\n<\/blockquote>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Click to view full response<\/summary>\n<p>The hierarchy of data structures in the XML file is organized as follows:<\/p>\n\n\n\n<p><strong>Root Element<\/strong>:<\/p>\n\n\n\n<p><code>&lt;product&gt;<\/code>: Represents the top-level element of the file. It includes attributes like <code>id<\/code>, <code>name<\/code>, <code>version<\/code>, and others. This serves as the main container for all subsequent elements.<\/p>\n\n\n\n<p><strong>Volume<\/strong>:<\/p>\n\n\n\n<p><code>&lt;volume&gt;<\/code>: Nested within <code>&lt;product&gt;<\/code>. Represents a collection of discs and related content. It includes attributes such as <code>id<\/code>, <code>name<\/code>, <code>number<\/code>, and metadata about file types and sizes.<\/p>\n\n\n\n<p><strong>Disc<\/strong>:<\/p>\n\n\n\n<p><code>&lt;disc&gt;<\/code>: Nested within <code>&lt;volume&gt;<\/code>. Represents individual discs in the collection. Each <code>&lt;disc&gt;<\/code> has attributes like <code>id<\/code> and <code>number<\/code>.<\/p>\n\n\n\n<p><strong>Parent<\/strong>:<\/p>\n\n\n\n<p><code>&lt;parent&gt;<\/code>: Nested within <code>&lt;disc&gt;<\/code>. Represents a grouping for source content, identified by an <code>id<\/code> attribute, usually set to &#8220;Source&#8221;.<\/p>\n\n\n\n<p><strong>Content<\/strong>:<\/p>\n\n\n\n<p><code>&lt;content&gt;<\/code>: Nested within <code>&lt;parent&gt;<\/code>. Represents individual animated background items. Each <code>&lt;content&gt;<\/code> element contains attributes like <code>id<\/code>, <code>type<\/code>, <code>name<\/code>, <code>description<\/code>, <code>resolution<\/code>, and frame-related metadata (e.g., <code>originalfps<\/code>, <code>frames<\/code>).<\/p>\n\n\n\n<p><strong>Keywords<\/strong>:<\/p>\n\n\n\n<p><code>&lt;keywords&gt;<\/code>: Nested within <code>&lt;content&gt;<\/code>. A placeholder element for additional metadata about each animated background item. It is currently empty in the provided XML file.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example Hierarchy<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>&lt;product&gt;<\/code>\n<ul class=\"wp-block-list\">\n<li><code>&lt;volume&gt;<\/code>\n<ul class=\"wp-block-list\">\n<li><code>&lt;disc&gt;<\/code>\n<ul class=\"wp-block-list\">\n<li><code>&lt;parent&gt;<\/code>\n<ul class=\"wp-block-list\">\n<li><code>&lt;content&gt;<\/code>\n<ul class=\"wp-block-list\">\n<li><code>&lt;keywords&gt;<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>This hierarchy reflects a clear structure to organize animated background content across collections, discs, and specific items within those discs.<\/p>\n<\/details>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Convert this xml into tables for product, volume, disc, and content<\/p>\n<\/blockquote>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Click to view full response<\/summary>\n<p>Here\u2019s a tabular representation of the XML data, broken down by Product, Volume, Disc, and Content.<\/p>\n\n\n\n<p><strong>Table: Product<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>ID<\/strong><\/th><th><strong>Name<\/strong><\/th><th><strong>Version<\/strong><\/th><th><strong>SingleContent<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Animated Canvases<\/td><td>Animated Canvases<\/td><td>1<\/td><td>true<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Table: Volume<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>ID<\/strong><\/th><th><strong>Name<\/strong><\/th><th><strong>Number<\/strong><\/th><th><strong>SourceFileType<\/strong><\/th><th><strong>PreviewDiscID<\/strong><\/th><th><strong>PreviewSuffix<\/strong><\/th><th><strong>PreviewInstallDir<\/strong><\/th><th><strong>PreviewPathOnDisc<\/strong><\/th><th><strong>PreviewThumbnailSuffix<\/strong><\/th><th><strong>InstallSizeImg<\/strong><\/th><th><strong>InstallSizeImgMov<\/strong><\/th><th><strong>TotalPreviewSize<\/strong><\/th><th><strong>TotalSourceSize<\/strong><\/th><th><strong>BaseJ3Version<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Animated Canvases Collection 3<\/td><td>Animated Canvases Collection 3<\/td><td>3<\/td><td>mov<\/td><td>ACNV_V03D01D_R1<\/td><td>.mov<\/td><td>Juicer3<\/td><td>Juicer3\/<\/td><td>.jpg<\/td><td>1<\/td><td>10<\/td><td>185<\/td><td>14464.62<\/td><td>3.03 Build 258<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Table: Disc<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>ID<\/strong><\/th><th><strong>VolumeID<\/strong><\/th><th><strong>Number<\/strong><\/th><\/tr><\/thead><tbody><tr><td>ACNV_V03D01D_R1<\/td><td>Animated Canvases Collection 3<\/td><td>1<\/td><\/tr><tr><td>ACNV_V03D02D_R1<\/td><td>Animated Canvases Collection 3<\/td><td>2<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Table: Content<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>ID<\/strong><\/th><th><strong>DiscID<\/strong><\/th><th><strong>Type<\/strong><\/th><th><strong>Name<\/strong><\/th><th><strong>OriginalFPS<\/strong><\/th><th><strong>Frames<\/strong><\/th><th><strong>Description<\/strong><\/th><th><strong>Resolution<\/strong><\/th><th><strong>ResX<\/strong><\/th><th><strong>ResY<\/strong><\/th><th><strong>Base<\/strong><\/th><th><strong>Keywords<\/strong><\/th><\/tr><\/thead><tbody><tr><td>All Star_HD<\/td><td>ACNV_V03D01D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>300<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Amber Rays_HD<\/td><td>ACNV_V03D01D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>300<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Approaching Doom_HD<\/td><td>ACNV_V03D01D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>600<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Balloon Rise_HD<\/td><td>ACNV_V03D01D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>600<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Blending Pipes_HD<\/td><td>ACNV_V03D01D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>450<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Bundle Of Joy_HD<\/td><td>ACNV_V03D01D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>600<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Center Of Attention_HD<\/td><td>ACNV_V03D01D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>300<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Hiding Magic_HD<\/td><td>ACNV_V03D02D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>300<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Higher Than The Sky_HD<\/td><td>ACNV_V03D02D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>450<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>This approach captures a normalized structure suitable for a database. Each table includes key fields that uniquely identify and relate the elements. If needed, additional rows can be added for the remaining content.<\/p>\n<\/details>\n\n\n\n<p>It didn&#8217;t get it exactly right, an ID was missing, fortunately I can ask for it to be added<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>include disc id for content, volume id for disc, product id for volume<\/p>\n<\/blockquote>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Click to view full response<\/summary>\n<p>Here&#8217;s the updated tabular representation with the Product ID included in the Volume table:<\/p>\n\n\n\n<p><strong>Table: Product<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>ID<\/strong><\/th><th><strong>Name<\/strong><\/th><th><strong>Version<\/strong><\/th><th><strong>SingleContent<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Animated Canvases<\/td><td>Animated Canvases<\/td><td>1<\/td><td>true<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Table: Volume<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>ID<\/strong><\/th><th><strong>ProductID<\/strong><\/th><th><strong>Name<\/strong><\/th><th><strong>Number<\/strong><\/th><th><strong>SourceFileType<\/strong><\/th><th><strong>PreviewDiscID<\/strong><\/th><th><strong>PreviewSuffix<\/strong><\/th><th><strong>PreviewInstallDir<\/strong><\/th><th><strong>PreviewPathOnDisc<\/strong><\/th><th><strong>PreviewThumbnailSuffix<\/strong><\/th><th><strong>InstallSizeImg<\/strong><\/th><th><strong>InstallSizeImgMov<\/strong><\/th><th><strong>TotalPreviewSize<\/strong><\/th><th><strong>TotalSourceSize<\/strong><\/th><th><strong>BaseJ3Version<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Animated Canvases Collection 3<\/td><td>Animated Canvases<\/td><td>Animated Canvases Collection 3<\/td><td>3<\/td><td>mov<\/td><td>ACNV_V03D01D_R1<\/td><td>.mov<\/td><td>Juicer3<\/td><td>Juicer3\/<\/td><td>.jpg<\/td><td>1<\/td><td>10<\/td><td>185<\/td><td>14464.62<\/td><td>3.03 Build 258<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Table: Disc<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>ID<\/strong><\/th><th><strong>VolumeID<\/strong><\/th><th><strong>Number<\/strong><\/th><\/tr><\/thead><tbody><tr><td>ACNV_V03D01D_R1<\/td><td>Animated Canvases Collection 3<\/td><td>1<\/td><\/tr><tr><td>ACNV_V03D02D_R1<\/td><td>Animated Canvases Collection 3<\/td><td>2<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Table: Content<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>ID<\/strong><\/th><th><strong>DiscID<\/strong><\/th><th><strong>Type<\/strong><\/th><th><strong>Name<\/strong><\/th><th><strong>OriginalFPS<\/strong><\/th><th><strong>Frames<\/strong><\/th><th><strong>Description<\/strong><\/th><th><strong>Resolution<\/strong><\/th><th><strong>ResX<\/strong><\/th><th><strong>ResY<\/strong><\/th><th><strong>Base<\/strong><\/th><th><strong>Keywords<\/strong><\/th><\/tr><\/thead><tbody><tr><td>All Star_HD<\/td><td>ACNV_V03D01D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>300<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Amber Rays_HD<\/td><td>ACNV_V03D01D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>300<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Approaching Doom_HD<\/td><td>ACNV_V03D01D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>600<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Balloon Rise_HD<\/td><td>ACNV_V03D01D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>600<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Blending Pipes_HD<\/td><td>ACNV_V03D01D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>450<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Bundle Of Joy_HD<\/td><td>ACNV_V03D01D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>600<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Center Of Attention_HD<\/td><td>ACNV_V03D01D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>300<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Hiding Magic_HD<\/td><td>ACNV_V03D02D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>300<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><tr><td>Higher Than The Sky_HD<\/td><td>ACNV_V03D02D_R1<\/td><td>1<\/td><td><\/td><td>30<\/td><td>450<\/td><td>Animated Background<\/td><td>hd<\/td><td>1920<\/td><td>1080<\/td><td><\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>This updated structure ensures that <strong>Volume<\/strong> is directly associated with the <strong>Product<\/strong>, creating a complete relational model.<\/p>\n<\/details>\n\n\n\n<h3 class=\"wp-block-heading\">Creating the code to load the data<\/h3>\n\n\n\n<p>Just a question away for the part that can take more time as a developer.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>generate python code to extract the data from the XML in this structure, and load it into a MySQL database<\/p>\n<\/blockquote>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Click to view full response<\/summary>\n<p>Here\u2019s the Python code to extract data from the XML file and load it into a MySQL database:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Code<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import xml.etree.ElementTree as ET\nimport mysql.connector\n\n# Parse the XML file\nxml_file = \"ACNV_V03D01D_R1.xml\"\ntree = ET.parse(xml_file)\nroot = tree.getroot()\n\n# MySQL connection\ndb = mysql.connector.connect(\n    host=\"localhost\",\n    user=\"your_username\",\n    password=\"your_password\",\n    database=\"your_database\"\n)\ncursor = db.cursor()\n\n# Create tables\ncursor.execute(\"\"\"\nCREATE TABLE IF NOT EXISTS Product (\n    id VARCHAR(255) PRIMARY KEY,\n    name VARCHAR(255),\n    version INT,\n    singlecontent BOOLEAN\n)\n\"\"\")\n\ncursor.execute(\"\"\"\nCREATE TABLE IF NOT EXISTS Volume (\n    id VARCHAR(255) PRIMARY KEY,\n    product_id VARCHAR(255),\n    name VARCHAR(255),\n    number INT,\n    sourcefiletype VARCHAR(50),\n    preview_discid VARCHAR(255),\n    preview_suffix VARCHAR(10),\n    preview_installdir VARCHAR(255),\n    preview_path_on_disc VARCHAR(255),\n    preview_thumbnail_suffix VARCHAR(10),\n    install_size_img INT,\n    install_size_img_mov INT,\n    total_preview_size INT,\n    total_source_size FLOAT,\n    base_j3_version VARCHAR(255),\n    FOREIGN KEY (product_id) REFERENCES Product(id)\n)\n\"\"\")\n\ncursor.execute(\"\"\"\nCREATE TABLE IF NOT EXISTS Disc (\n    id VARCHAR(255) PRIMARY KEY,\n    volume_id VARCHAR(255),\n    number INT,\n    FOREIGN KEY (volume_id) REFERENCES Volume(id)\n)\n\"\"\")\n\ncursor.execute(\"\"\"\nCREATE TABLE IF NOT EXISTS Content (\n    id VARCHAR(255) PRIMARY KEY,\n    disc_id VARCHAR(255),\n    type INT,\n    name VARCHAR(255),\n    originalfps INT,\n    frames INT,\n    description VARCHAR(255),\n    resolution VARCHAR(50),\n    resx INT,\n    resy INT,\n    base VARCHAR(255),\n    keywords TEXT,\n    FOREIGN KEY (disc_id) REFERENCES Disc(id)\n)\n\"\"\")\n\n# Extract and insert Product\nproduct = root.attrib\nproduct_id = product[\"id\"]\ncursor.execute(\"\"\"\nINSERT INTO Product (id, name, version, singlecontent)\nVALUES (%s, %s, %s, %s)\nON DUPLICATE KEY UPDATE name=VALUES(name), version=VALUES(version), singlecontent=VALUES(singlecontent)\n\"\"\", (product[\"id\"], product[\"name\"], int(product[\"version\"]), product[\"singlecontent\"] == \"true\"))\n\n# Extract and insert Volume\nfor volume in root.findall(\"volume\"):\n    volume_attrib = volume.attrib\n    cursor.execute(\"\"\"\n    INSERT INTO Volume (id, product_id, name, number, sourcefiletype, preview_discid, preview_suffix, preview_installdir,\n                        preview_path_on_disc, preview_thumbnail_suffix, install_size_img, install_size_img_mov,\n                        total_preview_size, total_source_size, base_j3_version)\n    VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)\n    ON DUPLICATE KEY UPDATE name=VALUES(name), number=VALUES(number), sourcefiletype=VALUES(sourcefiletype),\n                            preview_discid=VALUES(preview_discid), preview_suffix=VALUES(preview_suffix),\n                            preview_installdir=VALUES(preview_installdir), preview_path_on_disc=VALUES(preview_path_on_disc),\n                            preview_thumbnail_suffix=VALUES(preview_thumbnail_suffix), install_size_img=VALUES(install_size_img),\n                            install_size_img_mov=VALUES(install_size_img_mov), total_preview_size=VALUES(total_preview_size),\n                            total_source_size=VALUES(total_source_size), base_j3_version=VALUES(base_j3_version)\n    \"\"\", (volume_attrib[\"id\"], product_id, volume_attrib[\"name\"], int(volume_attrib[\"number\"]),\n          volume_attrib[\"sourcefiletype\"], volume_attrib[\"preview_discid\"], volume_attrib[\"preview_suffix\"],\n          volume_attrib[\"preview_install_dir\"], volume_attrib[\"preview_path_on_disc\"],\n          volume_attrib[\"preview_thumbnail_suffix\"], int(volume_attrib[\"install_size_img\"]),\n          int(volume_attrib[\"install_size_img_mov\"]), int(volume_attrib[\"totalPreviewSize\"]),\n          float(volume_attrib[\"totalSourceSize\"]), volume_attrib[\"baseJ3Version\"]))\n\n    # Extract and insert Disc\n    for disc in volume.findall(\"disc\"):\n        disc_attrib = disc.attrib\n        cursor.execute(\"\"\"\n        INSERT INTO Disc (id, volume_id, number)\n        VALUES (%s, %s, %s)\n        ON DUPLICATE KEY UPDATE volume_id=VALUES(volume_id), number=VALUES(number)\n        \"\"\", (disc_attrib[\"id\"], volume_attrib[\"id\"], int(disc_attrib[\"number\"])))\n\n        # Extract and insert Content\n        for content in disc.findall(\".\/\/content\"):\n            content_attrib = content.attrib\n            keywords = content.find(\"keywords\").text if content.find(\"keywords\") is not None else \"\"\n            cursor.execute(\"\"\"\n            INSERT INTO Content (id, disc_id, type, name, originalfps, frames, description, resolution, resx, resy, base, keywords)\n            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)\n            ON DUPLICATE KEY UPDATE type=VALUES(type), name=VALUES(name), originalfps=VALUES(originalfps), frames=VALUES(frames),\n                                    description=VALUES(description), resolution=VALUES(resolution), resx=VALUES(resx),\n                                    resy=VALUES(resy), base=VALUES(base), keywords=VALUES(keywords)\n            \"\"\", (content_attrib[\"id\"], disc_attrib[\"id\"], int(content_attrib[\"type\"]), content_attrib.get(\"name\", \"\"),\n                  int(content_attrib[\"originalfps\"]), int(content_attrib[\"frames\"]), content_attrib[\"description\"],\n                  content_attrib[\"resolution\"], int(content_attrib[\"resx\"]), int(content_attrib[\"resy\"]),\n                  content_attrib.get(\"base\", \"\"), keywords))\n\n# Commit and close\ndb.commit()\ncursor.close()\ndb.close()\n\nprint(\"Data successfully loaded into MySQL!\")<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Steps:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Install Dependencies<\/strong>: Ensure <code>mysql-connector-python<\/code> is installed:bashCopy code<code>pip install mysql-connector-python<\/code><\/li>\n\n\n\n<li><strong>Create MySQL Database<\/strong>: Replace placeholders (<code>your_username<\/code>, <code>your_password<\/code>, <code>your_database<\/code>) with actual database credentials.<\/li>\n\n\n\n<li><strong>Run the Script<\/strong>: Save the XML file as <code>ACNV_V03D01D_R1.xml<\/code> in the script\u2019s directory and execute the Python script. It will parse the XML, create tables if they don\u2019t exist, and load the data.<\/li>\n<\/ol>\n\n\n\n<p>This approach ensures deduplication using <code>ON DUPLICATE KEY UPDATE<\/code> and maintains referential integrity via foreign keys.<\/p>\n<\/details>\n\n\n\n<p>I&#8217;m now given python code which I can test<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testing my new data load process<\/h2>\n\n\n\n<p>For simplicity I&#8217;ll do it all on a local machine, also I&#8217;m not focusing on security here.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"> Creating the database &amp; user<\/h3>\n\n\n\n<p>Again, this can be simplified by AI (this time I used <a href=\"https:\/\/gemini.google.com\/\">Gemini from Google<\/a>) asking:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>generate MySQL sql to create a database called xml_loader_example, and grant all access to it to a new user called xml_loader_example_user<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- Create the database\nCREATE DATABASE IF NOT EXISTS xml_loader_example;\n\n-- Create the user (if it doesn't already exist)\nCREATE USER IF NOT EXISTS 'xml_loader_example_user'@'%' IDENTIFIED BY 'some_strong_password'; -- Replace with a real password!\n\n-- Grant all privileges on the database to the user\nGRANT ALL PRIVILEGES ON xml_loader_example.* TO 'xml_loader_example_user'@'%';\n\n-- Flush privileges to ensure the changes take effect\nFLUSH PRIVILEGES;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Setting up the virtual environemnt<\/h3>\n\n\n\n<p>I&#8217;m using Linux, if you don&#8217;t know about a virtual environment, check out the <a href=\"https:\/\/python.land\/virtual-environments\/virtualenv\">python venv documentation<\/a>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Create the virtual environment\npython -m venv venv\n\n# Activate it\nsource venv\/bin\/activate\n\n# Update pip (always good practice with a new virtual environment)\npip install --upgrade pip<\/pre>\n\n\n\n<p>Install the dependencies as suggested by ChatGPT<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install mysql-connector-python<\/pre>\n\n\n\n<p>Modify the code to contain the database credentials<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># MySQL connection\ndb = mysql.connector.connect(\n    host=\"localhost\",\n    user=\"xml_loader_example_user\",\n    password=\"some_strong_password\",\n    database=\"xml_loader_example\"\n)<\/pre>\n\n\n\n<p>And now the magic moment, does it work?<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python xml_loader.py\nData successfully loaded into MySQL!<\/pre>\n\n\n\n<p>My first thought was &#8220;Wow, that was fast&#8230; There were no errors, Did it work first time without any issues?&#8221;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Test it in MySQL<\/h3>\n\n\n\n<p>Again, I asked ChatGPT to create the SQL I wanted. <\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>generate SQL to show content ID and description, disc ID, volume name and product name<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">SELECT \n    c.id AS content_id,\n    c.description AS content_description,\n    d.id AS disc_id,\n    v.name AS volume_name,\n    p.name AS product_name\nFROM \n    Content c\nINNER JOIN \n    Disc d ON c.disc_id = d.id\nINNER JOIN \n    Volume v ON d.volume_id = v.id\nINNER JOIN \n    Product p ON v.product_id = p.id;\n<\/pre>\n\n\n\n<p>Here is the output (with the help of <a href=\"https:\/\/tableconvert.com\/mysql-to-csv\">tableconvert.com<\/a> to quickly format for the blog post):<\/p>\n\n\n\n<table id=\"tablepress-6\" class=\"tablepress tablepress-id-6\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">content_id<\/th><th class=\"column-2\">content_description<\/th><th class=\"column-3\">disc_id<\/th><th class=\"column-4\">volume_name<\/th><th class=\"column-5\">product_name<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">All Star_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">All Star_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">Amber Rays_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-5\">\n\t<td class=\"column-1\">Amber Rays_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-6\">\n\t<td class=\"column-1\">Approaching Doom_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-7\">\n\t<td class=\"column-1\">Approaching Doom_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-8\">\n\t<td class=\"column-1\">Balloon Rise_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-9\">\n\t<td class=\"column-1\">Balloon Rise_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-10\">\n\t<td class=\"column-1\">Blending Pipes_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-11\">\n\t<td class=\"column-1\">Blending Pipes_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-12\">\n\t<td class=\"column-1\">Bundle Of Joy_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-13\">\n\t<td class=\"column-1\">Bundle Of Joy_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-14\">\n\t<td class=\"column-1\">Center Of Attention_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-15\">\n\t<td class=\"column-1\">Center Of Attention_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-16\">\n\t<td class=\"column-1\">Cloud Interference_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-17\">\n\t<td class=\"column-1\">Cloud Interference_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-18\">\n\t<td class=\"column-1\">Coin Collection_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-19\">\n\t<td class=\"column-1\">Coin Collection_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-20\">\n\t<td class=\"column-1\">Dazzling Moonlight_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-21\">\n\t<td class=\"column-1\">Dazzling Moonlight_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-22\">\n\t<td class=\"column-1\">Diagonal Slide_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-23\">\n\t<td class=\"column-1\">Diagonal Slide_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-24\">\n\t<td class=\"column-1\">Different Positions_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-25\">\n\t<td class=\"column-1\">Different Positions_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-26\">\n\t<td class=\"column-1\">Firefly Goodbye_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-27\">\n\t<td class=\"column-1\">Firefly Goodbye_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-28\">\n\t<td class=\"column-1\">Fitting Frames_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-29\">\n\t<td class=\"column-1\">Fitting Frames_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-30\">\n\t<td class=\"column-1\">Flying Colors_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-31\">\n\t<td class=\"column-1\">Flying Colors_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-32\">\n\t<td class=\"column-1\">Frame Impression_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-33\">\n\t<td class=\"column-1\">Frame Impression_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-34\">\n\t<td class=\"column-1\">French Parade_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-35\">\n\t<td class=\"column-1\">French Parade_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-36\">\n\t<td class=\"column-1\">Garden Whispers_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-37\">\n\t<td class=\"column-1\">Garden Whispers_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-38\">\n\t<td class=\"column-1\">Happy Summer_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-39\">\n\t<td class=\"column-1\">Happy Summer_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-40\">\n\t<td class=\"column-1\">Heavenly Beam_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-41\">\n\t<td class=\"column-1\">Heavenly Beam_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D01D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-42\">\n\t<td class=\"column-1\">Hiding Magic_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-43\">\n\t<td class=\"column-1\">Hiding Magic_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-44\">\n\t<td class=\"column-1\">Higher Than The Sky_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-45\">\n\t<td class=\"column-1\">Higher Than The Sky_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-46\">\n\t<td class=\"column-1\">Hue Progression_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-47\">\n\t<td class=\"column-1\">Hue Progression_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-48\">\n\t<td class=\"column-1\">I Put A Spell On You_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-49\">\n\t<td class=\"column-1\">I Put A Spell On You_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-50\">\n\t<td class=\"column-1\">Magic Unleashed_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-51\">\n\t<td class=\"column-1\">Magic Unleashed_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-52\">\n\t<td class=\"column-1\">Restricted Area_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-53\">\n\t<td class=\"column-1\">Restricted Area_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-54\">\n\t<td class=\"column-1\">Sahara Evenings_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-55\">\n\t<td class=\"column-1\">Sahara Evenings_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-56\">\n\t<td class=\"column-1\">Sea Outside_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-57\">\n\t<td class=\"column-1\">Sea Outside_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-58\">\n\t<td class=\"column-1\">Searchlights_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-59\">\n\t<td class=\"column-1\">Searchlights_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-60\">\n\t<td class=\"column-1\">Sharp Stops_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-61\">\n\t<td class=\"column-1\">Sharp Stops_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-62\">\n\t<td class=\"column-1\">Shifting Midnight_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-63\">\n\t<td class=\"column-1\">Shifting Midnight_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-64\">\n\t<td class=\"column-1\">Slowly Spreading_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-65\">\n\t<td class=\"column-1\">Slowly Spreading_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-66\">\n\t<td class=\"column-1\">Smooth Ripples_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-67\">\n\t<td class=\"column-1\">Smooth Ripples_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-68\">\n\t<td class=\"column-1\">Soul Of Sin_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-69\">\n\t<td class=\"column-1\">Soul Of Sin_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-70\">\n\t<td class=\"column-1\">Square Resolution_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-71\">\n\t<td class=\"column-1\">Square Resolution_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-72\">\n\t<td class=\"column-1\">Star Attraction_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-73\">\n\t<td class=\"column-1\">Star Attraction_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-74\">\n\t<td class=\"column-1\">Start The Party_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-75\">\n\t<td class=\"column-1\">Start The Party_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-76\">\n\t<td class=\"column-1\">Strange Divisions_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-77\">\n\t<td class=\"column-1\">Strange Divisions_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-78\">\n\t<td class=\"column-1\">Stripe Intentions_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-79\">\n\t<td class=\"column-1\">Stripe Intentions_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-80\">\n\t<td class=\"column-1\">Suburban Summer_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-81\">\n\t<td class=\"column-1\">Suburban Summer_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-82\">\n\t<td class=\"column-1\">Surprising Revelation_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-83\">\n\t<td class=\"column-1\">Surprising Revelation_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-84\">\n\t<td class=\"column-1\">Tricky Footing_HD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<tr class=\"row-85\">\n\t<td class=\"column-1\">Tricky Footing_SD<\/td><td class=\"column-2\">Animated Background<\/td><td class=\"column-3\">ACNV_V03D02D_R1<\/td><td class=\"column-4\">Animated Canvases Collection 3<\/td><td class=\"column-5\">Animated Canvases<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n\n\n<h2 class=\"wp-block-heading\">Final thoughts<\/h2>\n\n\n\n<p>The solution was generated in a matter of minutes, something which would probably take a developer who doesn&#8217;t use python regularly a lot longer to write and debug. As a data professional, learning to use AI to support our development processes will enable us to be far more efficient.<\/p>\n\n\n\n<p>There are other approaches I could have taken, this is a very ETL (Extract Transform Load) approach, rather than an ELT (Extract Load Transform) approach of loading the XML into the database and using XML parsing there to extract the required data.<\/p>\n\n\n\n<p>One thing I didn&#8217;t include in the sample above was iterating over files (it only loads the one file). Of course, to iterate over multiple files I just had to ask:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>modify the python code to iterate over XML files in a directory<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Security, governance &amp; good practice<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Don&#8217;t trust anything generated by AI without reading\/checking it first, it can make mistakes.<\/li>\n\n\n\n<li>Don&#8217;t share sensitive company information\/data with an AI platform.<\/li>\n\n\n\n<li>Changes will have to be made to the code\/database for security\/limiting access (including not sticking with the default password suggested by Gemini).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Tools which do this for us<\/h3>\n\n\n\n<p>As a side note, If we just had one small simple file to load, then there are some online tools which I&#8217;d recommend developers have a play with. They use AI and general logic approaches to parse files and generate the content in SQL:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/tableconvert.com\/xml-to-sql\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/tableconvert.com\/xml-to-sql<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sqlizer.io\/xml-to-mysql\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/sqlizer.io\/xml-to-mysql\/<\/a><\/li>\n\n\n\n<li>Example output: <a href=\"https:\/\/www.db-fiddle.com\/f\/n1P63NYybzCmcaknb3hWwi\/0\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.db-fiddle.com\/f\/n1P63NYybzCmcaknb3hWwi\/0<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In today&#8217;s fast-paced development world, efficiency is paramount. AI can significantly accelerate the coding process, including the creation of scripts to interact with various data formats. This blog post will explore how to use AI assistance to generate Python code for loading a custom XML file.<\/p>\n","protected":false},"author":1,"featured_media":697,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[77,59,60],"tags":[],"class_list":["post-679","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-development","category-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Data loading, with the help of AI - Rows Across The Lake<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Data loading, with the help of AI - Rows Across The Lake\" \/>\n<meta property=\"og:description\" content=\"In today&#039;s fast-paced development world, efficiency is paramount. AI can significantly accelerate the coding process, including the creation of scripts to interact with various data formats. This blog post will explore how to use AI assistance to generate Python code for loading a custom XML file.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/\" \/>\n<meta property=\"og:site_name\" content=\"Rows Across The Lake\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-17T07:30:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-01-17T07:46:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/datablog.roman-halliday.com\/wp-content\/uploads\/2025\/01\/ai-generated-artificial-intelligence-8686301.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"1280\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"david\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@d_roman_h\" \/>\n<meta name=\"twitter:site\" content=\"@d_roman_h\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"david\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2025\\\/01\\\/17\\\/data-loading-with-the-help-of-ai\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2025\\\/01\\\/17\\\/data-loading-with-the-help-of-ai\\\/\"},\"author\":{\"name\":\"david\",\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/#\\\/schema\\\/person\\\/575f96d2590c3085923ff9e1b565748b\"},\"headline\":\"Data loading, with the help of AI\",\"datePublished\":\"2025-01-17T07:30:00+00:00\",\"dateModified\":\"2025-01-17T07:46:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2025\\\/01\\\/17\\\/data-loading-with-the-help-of-ai\\\/\"},\"wordCount\":1666,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/#\\\/schema\\\/person\\\/575f96d2590c3085923ff9e1b565748b\"},\"image\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2025\\\/01\\\/17\\\/data-loading-with-the-help-of-ai\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/ai-generated-artificial-intelligence-8686301.jpg\",\"articleSection\":[\"AI\",\"Development\",\"python\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2025\\\/01\\\/17\\\/data-loading-with-the-help-of-ai\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2025\\\/01\\\/17\\\/data-loading-with-the-help-of-ai\\\/\",\"url\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2025\\\/01\\\/17\\\/data-loading-with-the-help-of-ai\\\/\",\"name\":\"Data loading, with the help of AI - Rows Across The Lake\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2025\\\/01\\\/17\\\/data-loading-with-the-help-of-ai\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2025\\\/01\\\/17\\\/data-loading-with-the-help-of-ai\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/ai-generated-artificial-intelligence-8686301.jpg\",\"datePublished\":\"2025-01-17T07:30:00+00:00\",\"dateModified\":\"2025-01-17T07:46:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2025\\\/01\\\/17\\\/data-loading-with-the-help-of-ai\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2025\\\/01\\\/17\\\/data-loading-with-the-help-of-ai\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2025\\\/01\\\/17\\\/data-loading-with-the-help-of-ai\\\/#primaryimage\",\"url\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/ai-generated-artificial-intelligence-8686301.jpg\",\"contentUrl\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/ai-generated-artificial-intelligence-8686301.jpg\",\"width\":1280,\"height\":1280,\"caption\":\"ai generated artificial intelligence 8686301\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/index.php\\\/2025\\\/01\\\/17\\\/data-loading-with-the-help-of-ai\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Data loading, with the help of AI\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/#website\",\"url\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/\",\"name\":\"Rows Across The Lake\",\"description\":\"Data &amp; Databases\",\"publisher\":{\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/#\\\/schema\\\/person\\\/575f96d2590c3085923ff9e1b565748b\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/datablog.roman-halliday.com\\\/#\\\/schema\\\/person\\\/575f96d2590c3085923ff9e1b565748b\",\"name\":\"david\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g\",\"caption\":\"david\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Data loading, with the help of AI - Rows Across The Lake","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/","og_locale":"en_GB","og_type":"article","og_title":"Data loading, with the help of AI - Rows Across The Lake","og_description":"In today's fast-paced development world, efficiency is paramount. AI can significantly accelerate the coding process, including the creation of scripts to interact with various data formats. This blog post will explore how to use AI assistance to generate Python code for loading a custom XML file.","og_url":"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/","og_site_name":"Rows Across The Lake","article_published_time":"2025-01-17T07:30:00+00:00","article_modified_time":"2025-01-17T07:46:52+00:00","og_image":[{"width":1280,"height":1280,"url":"https:\/\/datablog.roman-halliday.com\/wp-content\/uploads\/2025\/01\/ai-generated-artificial-intelligence-8686301.jpg","type":"image\/jpeg"}],"author":"david","twitter_card":"summary_large_image","twitter_creator":"@d_roman_h","twitter_site":"@d_roman_h","twitter_misc":{"Written by":"david","Estimated reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/#article","isPartOf":{"@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/"},"author":{"name":"david","@id":"https:\/\/datablog.roman-halliday.com\/#\/schema\/person\/575f96d2590c3085923ff9e1b565748b"},"headline":"Data loading, with the help of AI","datePublished":"2025-01-17T07:30:00+00:00","dateModified":"2025-01-17T07:46:52+00:00","mainEntityOfPage":{"@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/"},"wordCount":1666,"commentCount":0,"publisher":{"@id":"https:\/\/datablog.roman-halliday.com\/#\/schema\/person\/575f96d2590c3085923ff9e1b565748b"},"image":{"@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/#primaryimage"},"thumbnailUrl":"https:\/\/datablog.roman-halliday.com\/wp-content\/uploads\/2025\/01\/ai-generated-artificial-intelligence-8686301.jpg","articleSection":["AI","Development","python"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/","url":"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/","name":"Data loading, with the help of AI - Rows Across The Lake","isPartOf":{"@id":"https:\/\/datablog.roman-halliday.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/#primaryimage"},"image":{"@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/#primaryimage"},"thumbnailUrl":"https:\/\/datablog.roman-halliday.com\/wp-content\/uploads\/2025\/01\/ai-generated-artificial-intelligence-8686301.jpg","datePublished":"2025-01-17T07:30:00+00:00","dateModified":"2025-01-17T07:46:52+00:00","breadcrumb":{"@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/#primaryimage","url":"https:\/\/datablog.roman-halliday.com\/wp-content\/uploads\/2025\/01\/ai-generated-artificial-intelligence-8686301.jpg","contentUrl":"https:\/\/datablog.roman-halliday.com\/wp-content\/uploads\/2025\/01\/ai-generated-artificial-intelligence-8686301.jpg","width":1280,"height":1280,"caption":"ai generated artificial intelligence 8686301"},{"@type":"BreadcrumbList","@id":"https:\/\/datablog.roman-halliday.com\/index.php\/2025\/01\/17\/data-loading-with-the-help-of-ai\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/datablog.roman-halliday.com\/"},{"@type":"ListItem","position":2,"name":"Data loading, with the help of AI"}]},{"@type":"WebSite","@id":"https:\/\/datablog.roman-halliday.com\/#website","url":"https:\/\/datablog.roman-halliday.com\/","name":"Rows Across The Lake","description":"Data &amp; Databases","publisher":{"@id":"https:\/\/datablog.roman-halliday.com\/#\/schema\/person\/575f96d2590c3085923ff9e1b565748b"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/datablog.roman-halliday.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/datablog.roman-halliday.com\/#\/schema\/person\/575f96d2590c3085923ff9e1b565748b","name":"david","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g","caption":"david"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/acddbc676a1d5c73795edcf0627ee39e5aa947da9033b58373e03d93122cb3b7?s=96&d=mm&r=g"}}]}},"_links":{"self":[{"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/posts\/679","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/comments?post=679"}],"version-history":[{"count":16,"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/posts\/679\/revisions"}],"predecessor-version":[{"id":699,"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/posts\/679\/revisions\/699"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/media\/697"}],"wp:attachment":[{"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/media?parent=679"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/categories?post=679"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/datablog.roman-halliday.com\/index.php\/wp-json\/wp\/v2\/tags?post=679"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}