Convert Schemas to Documents

Convert Schemas to Documents

he way that XML is being used, of late, is beginning to send tremors throughout much of the programming world. Part of this has to do with an obvious logical conclusion that can be derived from the structured nature of the language. First, you can represent almost any structured entity as XML code. Also, a programmatic class is a structured entity. Hence, you can represent a programmatic class as XML code.

Of course, that simple bit of logic covers a vast amount of implementation details, but in the main this is true. If you know the structure of an object (through its “schema”), then there is no reason that you couldn’t create an “instance” of that object from the schema. In that sense, the schema takes on the same role that a class constructor does in procedural languages?it defines the principle elements of the structure, possibly including the passing in of parameters to more fully flesh out given elements in the XML structure.

While this process will become easier with the introduction of archetypes in the full XML Schema, the Schema specification is still very much in flux, precisely because it does serve such a critical role. The Microsoft XML Technology Preview parser, released in late January, currently supports the older Schema specification (the Reduced Data Set specification covered in my previous 10-Minute Solution, “Generating XML from ADO Recordsets”), though the company has specifically pledged to provide an updated implementation shortly after the specification itself reaches recommended status.

As a consequence, the examples that I’ll show work with the older Schema. However, I’m also using the compliant W3C XSL-T Parser (the aforementioned XML Technology Preview, available at http://msdn.Microsoft.com/xml) in order to take advantage of such technologies as parameterization.

Objects, Collections, and Properties
Before jumping headfirst into XML code, I’d like to define a few bits of terminology. Specifically, I want to make the distinction between an object, a collection, a property, and a default property.

An object in XML terms could best be described as any entity that has an associated unique identifier. Put another way, an object is something that can be uniquely identified by name. For example, an employee schema could describe any number of different kinds of employees, but each such employee would have one element, or more likely attribute (typically an ID), that designates that element as being unique.

A collection is a set of zero or more structurally similar objects. ‘Structurally similar’ is a little harder to define, although in general, it means that it is derived from the same XML schema. Thus, while the internal elements for a marketing and programming employee may differ, they both would be produced from an employee schema.

A property is an element or attribute within an object that describes the object in some fashion (you could make a valid argument about whether an ID is a property or not…I personally don’t believe it is, but the reasons for that opinion exceed the scope of this article). In most cases, properties appear, at most, once within a given object.

A default property is an element or attribute that can occur either zero or one times within an object. It is a type of property, and generally represents a default case for the object.

Note that these differences are not mutually exclusive. In the simplest case, a collection contains zero or more objects, which are each, in turn, made up of zero or more properties. This is usually characteristic of database output, in which recordsets contain zero or more records, each of which are made up of one or more (typically unique) fields.

On the other hand, an object could simultaneously be a collection with both unique properties and sub-objects contained in the scope of the object itself. For example, a company division might contain division properties (the name of the division, its manager, current hiring status, and so forth) and employee objects all as immediate children of the division node in an XML tree. Typically, this situation is equivalent to having an collection as a property of the object holding the nodes, rather than the division acting as the container?in other words, making the implicit employees collection explicit. This also helps to keep the code more generic, as you can iterate through the collection’s contained objects using a wildcard in an XSL Path.

These definitions are important because they help you to determine the characteristic objects that you can create from the schema. Consider if you have an object that includes a collection of other sub-objects?how many sub-objects should be created? If you create a company division, as an example, you almost certainly don’t want that division to create a blank employee?rather, you’ll want the employees to be added separately through a different mechanism. Thus, in general, when creating an object that contains a collection of other objects, the instantiating program shouldn’t create the sub-objects at the same time.

Similarly, consider the problem of default properties. In a few instances, you can create an element or attribute that is considered implicit?if the XML document doesn’t contain the property, then the element or attribute is assumed to have an already-defined default value. For example, you may have a default set up for an employee that assumes his or her vested attribute is set to “false”. However, these defaults exist for convenience sake?to cut down the size of files or reduce the amount of typing, among other things?but their values should be explicitly included for any generated instance because this information can drive subsequent code.

The code to do this in XSL is surprisingly compact, and is given in Listing 1, MakeInstanceFromSchema.xsl. A schema can contain the definitions of any number of different object “classes”, so an XML parameter called objectName is provided to let you set the object that you want to retrieve.

By default, through the fairly complex expression:

the parameter will retrieve the name of the last ElementType node in the schema, which is also the definition for the root node of the resulting object. You use this name, in turn, to retrieve the first element. If this process seems somewhat circular, it is?for the default case. However, if you replace the selection with a string expression (such as ’employee’ for a list of employees within an node), then the resulting tree starts from that point in the schema instead.

Thus, consider the employees schema given in Listing 2, EmployeesSchema.xml. The last elementType defined is the one for the root node . If the parameter is not changed, then it is this node that is converted into an object (in this case, the empty collection , because the employees collection does not have any innate properties).

Immediately before that, the node is defined, which consists of a number of properties, including one default property . If you change the objectName parameter’s definition to (note the string within a string):

then the XSL function, when passed the schema, will produce an instance of the “employee” object instead:

				<dateStarted/>	<salary/>	<department/>	<canHire>false</canHire></employee></code></pre>
<p>Notice that what is produced here is, with the exception of the canHire element, a completely blank record.  The schema itself doesn’t (and shouldn’t) contain any parametric information for loading the newly created objects (although see my discussion of parameterization later in this article).</p>
<p>Most of the real action in producing this output comes from the ElementType template in the XSL document (see <a href="javascript:showSupportItem('listing3');">Listing 3</a>). The expression <xsl:element name="{@name}"> creates a new element with the name given by the ElementType’s name attribute.  Once the element is created, attributes are added by iterating through each <attribute> child in <ElementType> defining a variable that contains the <attribute>‘s type attribute, then using that name to create a new attribute for the just created element with that name. Finally, if the attribute has a specific predefined default value (contained in the dt:default attribute), then the newly minted attribute’s value is set to this. </p>
<p>Creating child elements is a little more complicated?specifically, you apply two tests. The first test checks to see if the element tag has a minoccurs attribute (the number of times the element occurs in the parent element) greater than 0.  If it does, this element is automatically assumed to be a property and is automatically included. This expression retrieves the corresponding element name, then recursively applies the same template to the child:</p>
<pre><code><xsl:variable name="elementName" select="@type"/><xsl:apply-templates select="//ElementType[@name=$elementName]"/></code></pre>
<p>On the other hand, if the minoccurs attribute is zero, things get a little more problematic.  There are two possibilities here?if maxoccurs is one, then the element is a default property?if it hadn’t been listed, then you would assume it had a certain value (or a certain set of sub-nodes). On the other hand, if maxoccurs is unlimited (has a value of  “*”), then you have an object instead. Previously, I said that an object has a unique ID (which could certainly be tested for in its stead). But more accurately, an object simply has one characteristic that defines it as being unique, and there’s no guarantee in the schema that an explicit ID is given?although technically it should be. Thus, the test for an object comes down to a test to see if an element has a minoccurs of “0” and a maxoccurs of “*”.</p>
<p><strong>Take Advantage of Parameterization</strong><br />Unfortunately, instantiating objects from a schema looks very much like the problem of creating objects from Visual Basic?there are no explicit constructors for loading the newly created instance with data. The instanceData parameter serves this role. This parameter should hold a single element with one attribute corresponding to each of the properties that you want to fill.  </p>
<p>For example, suppose that you wanted to create a new record based upon an ADO database record that returns each property to be filled as an attribute. The element itself might look something like:</p>
<pre><code><record id="empl12533" firstName="Kurt" lastName="Cagle" title="Author" salary="65536"/></code></pre>
<p>This record is incomplete to illustrate that you don’t need all the parameters to instantiate the object.  You could use the following JavaScript code to insert this element into the instanceData parameter, where recNode contains the indicated data record, makeInstanceFromSchema contains the XSL object, and employeesSchema contains the schema XML document:</p>
<pre><code>Set paramNode=makeInstanceFromSchema(    "//xsl:param[@name='instanceData']");If(paramNode.childNodes.length>0){    paramNode.replaceChild(recNode,paramNode.childNodes(0));    }else {    paramNode.appendChild recNode    }set objectNameNode=makeInstanceFromSchema(      "//xsl:param[@name='objectName']");objectNameNode.setAttribute "select","employee"employeesSchema.transformNodeToObject(makeInstanceFromSchema,employee)</code></pre>
<p>The employee object now contains the XML document:</p>
<pre><code><employee id="empl12533">	<firstName>Kurt</firstName>	<lastName>Cagle</lastName>	<title>Author		65536		false

This requires knowing the names of the fields (and you could probably argue that if you knew this information, you could recreate the object from a template in the first place), but the advantage of going with this approach becomes much more evident when dealing with larger (and deeper) schemas.

Convert XML Documents to Schema
A related problem to creating an object from a schema is building a schema from an object. This task may seem a little odd at first glance, but the principal reason for wanting to create a schema from an object is to generate schemas without having to do a lot of work. In general, you know the XML document that you want the schema to represent, but building the full schema can be a pain. Note that the results of this operation likely won’t make a finished product?there are many relationships that can’t be deduced from a document with regard to its schema?but it’s useful for creating a skeleton.

The code in Listing 4, BuildSchema.xsl, generates the schema element. Because a generated schema element can raise errors if given as a single element, you break the element up into a set of xsl:attribute declarations with a default name of Undefined.xml and schema declarations for the datatype and schema namespaces.

The code then searches for the root node. Here’s where things get interesting. Because schemas contain their elements from the end of the document forward (relative to the order in which the tree is walked), you need to generate the actual XML structure in reverse. To do this, for each element, the attributes for that node are processed first, then the child elements of the current element, and finally the node itself. This form of recursion is especially useful for creating end-forward structures such as schemas.

One effect of this is to place all of the AttributeType tags at the beginning of the document, although they appear in the order that they’re encountered. Subordinate tags can then always refer to these objects defined previously in the document. This is true of tags being able to refer to previously defined tags as well.

While the code is pretty straightforward (especially when compared to the MakeInstanceFromSchema XSL document), I did want to highlight the element for a moment. This tag is part of the XML Schema specification, and has the added advantage of being able to contain XML code within it that’s not part of the default specification. In this case, I created a and <body> tag which can be used to provide some helpful information to applications (or tables output to HTML). </p> <p>The source XML file to be transformed into a schema should strive for simplicity?for collections, include only one instance of each object being collected (in other words, to generate the schema from a selection of <employee> objects within an <employees> node, include only one employee). The conversion routine isn’t smart enough to recognize multiple instances and act accordingly, although that is not a complicated exercise to handle. </p> <p>Finally, remember that the schema specified here is the Microsoft Reduced Data Schema, not the final W3C Schema. I’m hoping to create more robust converters for that once the Schema specification itself is finalized.</p> <p>One of the real strengths of XML is that it is essentially self-describing in the dialect that it is written. This may seem obvious, but consider that with procedural languages, creating a class from an object is well nigh impossible without very specialized (and complex) tools. When the new Schema spec does become real, it will include other elements such as data type definition and archetypes that will push the object-oriented nature of XML even further, making it a substrate of a new and powerful computing language. </p> </div> </div> <div class="elementor-element elementor-element-4f9883d elementor-widget elementor-widget-post-navigation" data-id="4f9883d" data-element_type="widget" data-widget_type="post-navigation.default"> <div class="elementor-widget-container"> <div class="elementor-post-navigation"> <div class="elementor-post-navigation__prev elementor-post-navigation__link"> <a href="https://www.devx.com/tip-bank/13816/" rel="prev"><span class="elementor-post-navigation__link__prev"><span class="post-navigation__prev--label">Previous</span></span></a> </div> <div class="elementor-post-navigation__next elementor-post-navigation__link"> <a href="https://www.devx.com/tip-bank/25727/" rel="next"><span class="elementor-post-navigation__link__next"><span class="post-navigation__next--label">Next</span></span></a> </div> </div> </div> </div> <div class="elementor-element elementor-element-2bf5b4bc elementor-widget elementor-widget-heading" data-id="2bf5b4bc" data-element_type="widget" data-widget_type="heading.default"> <div class="elementor-widget-container"> <span class="elementor-heading-title elementor-size-default">Share the Post:</span> </div> </div> <div class="elementor-element elementor-element-496b8f65 elementor-share-buttons--view-icon elementor-share-buttons--skin-minimal elementor-share-buttons--color-custom elementor-share-buttons--shape-square elementor-grid-0 elementor-widget elementor-widget-share-buttons" data-id="496b8f65" data-element_type="widget" data-widget_type="share-buttons.default"> <div class="elementor-widget-container"> <link rel="stylesheet" href="https://www.devx.com/wp-content/plugins/elementor-pro/assets/css/widget-share-buttons.min.css"> <div class="elementor-grid"> <div class="elementor-grid-item"> <div class="elementor-share-btn elementor-share-btn_facebook" role="button" tabindex="0" aria-label="Share on facebook" > <span class="elementor-share-btn__icon"> <i class="fab fa-facebook" aria-hidden="true"></i> </span> </div> </div> <div class="elementor-grid-item"> <div class="elementor-share-btn elementor-share-btn_twitter" role="button" tabindex="0" aria-label="Share on twitter" > <span class="elementor-share-btn__icon"> <i class="fab fa-twitter" aria-hidden="true"></i> </span> </div> </div> <div class="elementor-grid-item"> <div class="elementor-share-btn elementor-share-btn_linkedin" role="button" tabindex="0" aria-label="Share on linkedin" > <span class="elementor-share-btn__icon"> <i class="fab fa-linkedin" aria-hidden="true"></i> </span> </div> </div> </div> </div> </div> <div class="elementor-element elementor-element-39bd7056 elementor-grid-1 elementor-posts--thumbnail-right elementor-grid-tablet-2 elementor-grid-mobile-1 load-more-align-center elementor-widget elementor-widget-posts" data-id="39bd7056" data-element_type="widget" data-settings="{"classic_columns":"1","classic_row_gap":{"unit":"px","size":0,"sizes":[]},"pagination_type":"load_more_on_click","classic_columns_tablet":"2","classic_columns_mobile":"1","classic_row_gap_tablet":{"unit":"px","size":"","sizes":[]},"classic_row_gap_mobile":{"unit":"px","size":"","sizes":[]},"load_more_spinner":{"value":"fas fa-spinner","library":"fa-solid"}}" data-widget_type="posts.classic"> <div class="elementor-widget-container"> <link rel="stylesheet" href="https://www.devx.com/wp-content/plugins/elementor-pro/assets/css/widget-posts.min.css"> <div class="elementor-posts-container elementor-posts elementor-posts--skin-classic elementor-grid"> <article class="elementor-post elementor-grid-item post-25988 post type-post status-publish format-standard has-post-thumbnail hentry category-devx-daily-news category-uncategorized tag-gm tag-uprotocol"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/uncategorized/gm-creates-open-source-uprotocol-and-invites-automakers-to-adopt-it-revolutionizing-automotive-software-development/" > <div class="elementor-post__thumbnail"><img width="381" height="286" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-full size-full wp-image-26032 ewww_webp" alt="GM Creates Open Source uProtocol and Invites Automakers to Adopt It: Revolutionizing Automotive Software Development." loading="lazy" data-src-img="https://www.devx.com/wp-content/uploads/Screenshot-2023-06-02-at-11.30.24-AM.png" data-src-webp="https://www.devx.com/wp-content/uploads/Screenshot-2023-06-02-at-11.30.24-AM.png.webp" data-eio="j" /><noscript><img width="381" height="286" src="https://www.devx.com/wp-content/uploads/Screenshot-2023-06-02-at-11.30.24-AM.png" class="elementor-animation-grow attachment-full size-full wp-image-26032" alt="GM Creates Open Source uProtocol and Invites Automakers to Adopt It: Revolutionizing Automotive Software Development." loading="lazy" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/uncategorized/gm-creates-open-source-uprotocol-and-invites-automakers-to-adopt-it-revolutionizing-automotive-software-development/" > GM Creates Open Source uProtocol and Invites Automakers to Adopt It: Revolutionizing Automotive Software Development. </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-date"> June 2, 2023 </span> </div> <div class="elementor-post__excerpt"> <p>General Motors (GM) recently announced its entry into the Eclipse Foundation. The Eclipse Foundation is a prominent open-source software foundation. In addition, GMC announced its contribution of “uProtocol” to facilitate</p> </div> </div> </article> <article class="elementor-post elementor-grid-item post-26024 post type-post status-publish format-standard has-post-thumbnail hentry category-data-access category-data-access-and-management category-devx category-tech-trends tag-ai tag-data-management tag-security tag-technology"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/data-access/what-is-metadata/" > <div class="elementor-post__thumbnail"><img width="1920" height="1280" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-full size-full wp-image-26026 ewww_webp" alt="Heading photo, Metadata." loading="lazy" data-src-img="https://www.devx.com/wp-content/uploads/pexels-markus-spiske-2004161.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/pexels-markus-spiske-2004161.jpg.webp" data-eio="j" /><noscript><img width="1920" height="1280" src="https://www.devx.com/wp-content/uploads/pexels-markus-spiske-2004161.jpg" class="elementor-animation-grow attachment-full size-full wp-image-26026" alt="Heading photo, Metadata." loading="lazy" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/data-access/what-is-metadata/" > What is Metadata? </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-date"> June 1, 2023 </span> </div> <div class="elementor-post__excerpt"> <p>What is metadata? Well, It’s an odd concept to wrap your head around. Metadata is essentially the secondary layer of data that tracks details about the “regular” data. The regular</p> </div> </div> </article> <article class="elementor-post elementor-grid-item post-26016 post type-post status-publish format-standard has-post-thumbnail hentry category-data-access-and-management"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/data-access-and-management/what-we-should-expect-from-cell-phone-tech-in-the-near-future/" > <div class="elementor-post__thumbnail"><img width="1707" height="2560" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-full size-full wp-image-26017 ewww_webp" alt="cell phones" loading="lazy" data-src-img="https://www.devx.com/wp-content/uploads/pexels-rdne-stock-project-4921398-scaled.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/pexels-rdne-stock-project-4921398-scaled.jpg.webp" data-eio="j" /><noscript><img width="1707" height="2560" src="https://www.devx.com/wp-content/uploads/pexels-rdne-stock-project-4921398-scaled.jpg" class="elementor-animation-grow attachment-full size-full wp-image-26017" alt="cell phones" loading="lazy" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/data-access-and-management/what-we-should-expect-from-cell-phone-tech-in-the-near-future/" > What We Should Expect from Cell Phone Tech in the Near Future </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-date"> May 31, 2023 </span> </div> <div class="elementor-post__excerpt"> <p>The earliest cell phones included boxy designs full of buttons and antennas, and they only made calls. Needless to say, we’ve come a long way from those classic brick phones</p> </div> </div> </article> <article class="elementor-post elementor-grid-item post-25678 post type-post status-publish format-standard has-post-thumbnail hentry category-tech-trends category-technology tag-keyboards tag-mechanical-keyboards"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/tech-trends/the-best-mechanical-keyboards-for-programmers-where-to-find-them/" > <div class="elementor-post__thumbnail"><img width="1920" height="1280" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-full size-full wp-image-25998 ewww_webp" alt="Where to find the Best Mechanical Keyboards for Programmers" loading="lazy" data-src-img="https://www.devx.com/wp-content/uploads/pexels-karol-d-841228.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/pexels-karol-d-841228.jpg.webp" data-eio="j" /><noscript><img width="1920" height="1280" src="https://www.devx.com/wp-content/uploads/pexels-karol-d-841228.jpg" class="elementor-animation-grow attachment-full size-full wp-image-25998" alt="Where to find the Best Mechanical Keyboards for Programmers" loading="lazy" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/tech-trends/the-best-mechanical-keyboards-for-programmers-where-to-find-them/" > The Best Mechanical Keyboards For Programmers: Where To Find Them </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-date"> May 29, 2023 </span> </div> <div class="elementor-post__excerpt"> <p>When it comes to programming, a good mechanical keyboard can make all the difference. Naturally, you would want one of the best mechanical keyboards for programmers. But with so many</p> </div> </div> </article> <article class="elementor-post elementor-grid-item post-26000 post type-post status-publish format-standard has-post-thumbnail hentry category-devx-daily-news tag-big-brother"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/devx-daily-news/the-digital-panopticon-is-big-brother-always-watching-us-online/" > <div class="elementor-post__thumbnail"><img width="1920" height="1280" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-full size-full wp-image-26001 ewww_webp" alt="The Digital Panopticon: Is Big Brother Always Watching Us Online?" loading="lazy" data-src-img="https://www.devx.com/wp-content/uploads/marvin-meyer-SYTO3xs06fU-unsplash-1.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/marvin-meyer-SYTO3xs06fU-unsplash-1.jpg.webp" data-eio="j" /><noscript><img width="1920" height="1280" src="https://www.devx.com/wp-content/uploads/marvin-meyer-SYTO3xs06fU-unsplash-1.jpg" class="elementor-animation-grow attachment-full size-full wp-image-26001" alt="The Digital Panopticon: Is Big Brother Always Watching Us Online?" loading="lazy" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/devx-daily-news/the-digital-panopticon-is-big-brother-always-watching-us-online/" > The Digital Panopticon: Is Big Brother Always Watching Us Online? </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-date"> May 26, 2023 </span> </div> <div class="elementor-post__excerpt"> <p>In the age of digital transformation, the internet has become a ubiquitous part of our lives. From socializing, shopping, and learning to more sensitive activities such as banking and healthcare,</p> </div> </div> </article> <article class="elementor-post elementor-grid-item post-25983 post type-post status-publish format-standard has-post-thumbnail hentry category-artificial-intelligence-ai"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/artificial-intelligence-ai/embracing-change-how-ai-is-revolutionizing-the-developers-role/" > <div class="elementor-post__thumbnail"><img width="1920" height="1440" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-full size-full wp-image-25984 ewww_webp" alt="web developer" loading="lazy" data-src-img="https://www.devx.com/wp-content/uploads/web-developer.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/web-developer.jpg.webp" data-eio="j" /><noscript><img width="1920" height="1440" src="https://www.devx.com/wp-content/uploads/web-developer.jpg" class="elementor-animation-grow attachment-full size-full wp-image-25984" alt="web developer" loading="lazy" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/artificial-intelligence-ai/embracing-change-how-ai-is-revolutionizing-the-developers-role/" > Embracing Change: How AI Is Revolutionizing the Developer’s Role </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-date"> May 25, 2023 </span> </div> <div class="elementor-post__excerpt"> <p>The world of software development is changing drastically with the introduction of Artificial Intelligence and Machine Learning technologies. In the past, software developers were in charge of the entire development</p> </div> </div> </article> <article class="elementor-post elementor-grid-item post-25978 post type-post status-publish format-standard has-post-thumbnail hentry category-security"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/security/the-benefits-of-using-xdr-solutions/" > <div class="elementor-post__thumbnail"><img width="512" height="342" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-full size-full wp-image-25979 ewww_webp" alt="XDR solutions" loading="lazy" data-src-img="https://www.devx.com/wp-content/uploads/XDR-solutions.jpeg" data-src-webp="https://www.devx.com/wp-content/uploads/XDR-solutions.jpeg.webp" data-eio="j" /><noscript><img width="512" height="342" src="https://www.devx.com/wp-content/uploads/XDR-solutions.jpeg" class="elementor-animation-grow attachment-full size-full wp-image-25979" alt="XDR solutions" loading="lazy" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/security/the-benefits-of-using-xdr-solutions/" > The Benefits of Using XDR Solutions </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-date"> May 24, 2023 </span> </div> <div class="elementor-post__excerpt"> <p>Cybercriminals constantly adapt their strategies, developing newer, more powerful, and intelligent ways to attack your network. Since security professionals must innovate as well, more conventional endpoint detection solutions have evolved</p> </div> </div> </article> <article class="elementor-post elementor-grid-item post-25973 post type-post status-publish format-standard has-post-thumbnail hentry category-artificial-intelligence-ai category-security"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/artificial-intelligence-ai/how-ai-is-revolutionizing-fraud-detection/" > <div class="elementor-post__thumbnail"><img width="512" height="341" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-full size-full wp-image-25975 ewww_webp" alt="AI is revolutionizing fraud detection" loading="lazy" data-src-img="https://www.devx.com/wp-content/uploads/AI-is-revolutionizing-fraud-detection.jpeg" data-src-webp="https://www.devx.com/wp-content/uploads/AI-is-revolutionizing-fraud-detection.jpeg.webp" data-eio="j" /><noscript><img width="512" height="341" src="https://www.devx.com/wp-content/uploads/AI-is-revolutionizing-fraud-detection.jpeg" class="elementor-animation-grow attachment-full size-full wp-image-25975" alt="AI is revolutionizing fraud detection" loading="lazy" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/artificial-intelligence-ai/how-ai-is-revolutionizing-fraud-detection/" > How AI is Revolutionizing Fraud Detection </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-date"> May 23, 2023 </span> </div> <div class="elementor-post__excerpt"> <p>Artificial intelligence – commonly known as AI – means a form of technology with multiple uses. As a result, it has become extremely valuable to a number of businesses across</p> </div> </div> </article> <article class="elementor-post elementor-grid-item post-25410 post type-post status-publish format-standard has-post-thumbnail hentry category-artificial-intelligence-ai"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/artificial-intelligence-ai/companies-leading-ai-innovation-in-2023/" > <div class="elementor-post__thumbnail"><img width="1920" height="1440" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-full size-full wp-image-25968 ewww_webp" alt="AI innovation" loading="lazy" data-src-img="https://www.devx.com/wp-content/uploads/AI-innovation.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/AI-innovation.jpg.webp" data-eio="j" /><noscript><img width="1920" height="1440" src="https://www.devx.com/wp-content/uploads/AI-innovation.jpg" class="elementor-animation-grow attachment-full size-full wp-image-25968" alt="AI innovation" loading="lazy" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/artificial-intelligence-ai/companies-leading-ai-innovation-in-2023/" > Companies Leading AI Innovation in 2023 </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-date"> May 22, 2023 </span> </div> <div class="elementor-post__excerpt"> <p>Artificial intelligence (AI) has been transforming industries and revolutionizing business operations. AI’s potential to enhance efficiency and productivity has become crucial to many businesses. As we move into 2023, several</p> </div> </div> </article> <article class="elementor-post elementor-grid-item post-25406 post type-post status-publish format-standard has-post-thumbnail hentry category-enterprise category-uncategorized category-small-business category-tools"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/small-business/step-by-step-guide-to-properly-copyright-your-website/" > <div class="elementor-post__thumbnail"><img width="1920" height="1277" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-full size-full wp-image-25961 ewww_webp" alt="copyright your website" loading="lazy" data-src-img="https://www.devx.com/wp-content/uploads/copyright-your-website.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/copyright-your-website.jpg.webp" data-eio="j" /><noscript><img width="1920" height="1277" src="https://www.devx.com/wp-content/uploads/copyright-your-website.jpg" class="elementor-animation-grow attachment-full size-full wp-image-25961" alt="copyright your website" loading="lazy" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/small-business/step-by-step-guide-to-properly-copyright-your-website/" > Step-by-Step Guide to Properly Copyright Your Website </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-date"> May 18, 2023 </span> </div> <div class="elementor-post__excerpt"> <p>Creating a website is not easy, but protecting your website is equally important. Implementing copyright laws ensures that the substance of your website remains secure and sheltered. Copyrighting your website</p> </div> </div> </article> <article class="elementor-post elementor-grid-item post-25417 post type-post status-publish format-standard has-post-thumbnail hentry category-data-access category-software"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/software/fivetran-pricing-explained/" > <div class="elementor-post__thumbnail"><img width="1920" height="1281" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-full size-full wp-image-25942 ewww_webp" alt="data fivetran pricing" loading="lazy" data-src-img="https://www.devx.com/wp-content/uploads/data-fivetran-pricing.jpg" data-src-webp="https://www.devx.com/wp-content/uploads/data-fivetran-pricing.jpg.webp" data-eio="j" /><noscript><img width="1920" height="1281" src="https://www.devx.com/wp-content/uploads/data-fivetran-pricing.jpg" class="elementor-animation-grow attachment-full size-full wp-image-25942" alt="data fivetran pricing" loading="lazy" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/software/fivetran-pricing-explained/" > Fivetran Pricing Explained </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-date"> May 17, 2023 </span> </div> <div class="elementor-post__excerpt"> <p>One of the biggest trends of the 21st century is the massive surge in analytics. Analytics is the process of utilizing data to drive future decision-making. With so much of</p> </div> </div> </article> <article class="elementor-post elementor-grid-item post-25936 post type-post status-publish format-standard has-post-thumbnail hentry category-software"> <a class="elementor-post__thumbnail__link" href="https://www.devx.com/software/kubernetes-logging/" > <div class="elementor-post__thumbnail"><img width="512" height="341" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="elementor-animation-grow attachment-full size-full wp-image-25938 ewww_webp" alt="kubernetes logging" loading="lazy" data-src-img="https://www.devx.com/wp-content/uploads/kubernetes-logging.jpeg" data-src-webp="https://www.devx.com/wp-content/uploads/kubernetes-logging.jpeg.webp" data-eio="j" /><noscript><img width="512" height="341" src="https://www.devx.com/wp-content/uploads/kubernetes-logging.jpeg" class="elementor-animation-grow attachment-full size-full wp-image-25938" alt="kubernetes logging" loading="lazy" /></noscript></div> </a> <div class="elementor-post__text"> <h3 class="elementor-post__title"> <a href="https://www.devx.com/software/kubernetes-logging/" > Kubernetes Logging: What You Need to Know </a> </h3> <div class="elementor-post__meta-data"> <span class="elementor-post-date"> May 16, 2023 </span> </div> <div class="elementor-post__excerpt"> <p>Kubernetes from Google is one of the most popular open-source and free container management solutions made to make managing and deploying applications easier. It has a solid architecture that makes</p> </div> </div> </article> </div> <span class="e-load-more-spinner"> <i aria-hidden="true" class="fas fa-spinner"></i> </span> <div class="e-load-more-anchor" data-page="1" data-max-page="1499" data-next-page="https://www.devx.com/get-help/20354/2/"></div> <div class="elementor-button-wrapper"> <a href="#" class="elementor-button-link elementor-button elementor-animation-grow" role="button"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Show More</span> </span> </a> </div> <div class="e-load-more-message"></div> </div> </div> </div> </div> </div> </section> </div> </div> <div class="elementor-column elementor-col-20 elementor-top-column elementor-element elementor-element-270dc71" data-id="270dc71" data-element_type="column"> <div class="elementor-widget-wrap"> </div> </div> <div class="elementor-column elementor-col-20 elementor-top-column elementor-element elementor-element-8905b95 elementor-hidden-tablet" data-id="8905b95" data-element_type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-46d69df elementor-widget elementor-widget-html" data-id="46d69df" data-element_type="widget" data-widget_type="html.default"> <div class="elementor-widget-container"> <iframe id="JotFormIFrame-230167013128041" title="Daily Technology News Straight to Your Inbox" onload="window.parent.scrollTo(0,0)" allowtransparency="true" allowfullscreen="true" allow="geolocation; microphone; camera" src="https://form.jotform.com/230167013128041" frameborder="0" style=" min-width: 100%; height:539px; border:none;" scrolling="no" > </iframe> <script type="text/javascript"> var ifr = document.getElementById("JotFormIFrame-230167013128041"); if (ifr) { var src = ifr.src; var iframeParams = []; if (window.location.href && window.location.href.indexOf("?") > -1) { iframeParams = iframeParams.concat(window.location.href.substr(window.location.href.indexOf("?") + 1).split('&')); } if (src && src.indexOf("?") > -1) { iframeParams = iframeParams.concat(src.substr(src.indexOf("?") + 1).split("&")); src = src.substr(0, src.indexOf("?")) } iframeParams.push("isIframeEmbed=1"); ifr.src = src + "?" + iframeParams.join('&'); } window.handleIFrameMessage = function(e) { if (typeof e.data === 'object') { return; } var args = e.data.split(":"); if (args.length > 2) { iframe = document.getElementById("JotFormIFrame-" + args[(args.length - 1)]); } else { iframe = document.getElementById("JotFormIFrame"); } if (!iframe) { return; } switch (args[0]) { case "scrollIntoView": iframe.scrollIntoView(); break; case "setHeight": iframe.style.height = args[1] + "px"; if (!isNaN(args[1]) && parseInt(iframe.style.minHeight) > parseInt(args[1])) { iframe.style.minHeight = args[1] + "px"; } break; case "collapseErrorPage": if (iframe.clientHeight > window.innerHeight) { iframe.style.height = window.innerHeight + "px"; } break; case "reloadPage": window.location.reload(); break; case "loadScript": if( !window.isPermitted(e.origin, ['jotform.com', 'jotform.pro']) ) { break; } var src = args[1]; if (args.length > 3) { src = args[1] + ':' + args[2]; } var script = document.createElement('script'); script.src = src; script.type = 'text/javascript'; document.body.appendChild(script); break; case "exitFullscreen": if (window.document.exitFullscreen) window.document.exitFullscreen(); else if (window.document.mozCancelFullScreen) window.document.mozCancelFullScreen(); else if (window.document.mozCancelFullscreen) window.document.mozCancelFullScreen(); else if (window.document.webkitExitFullscreen) window.document.webkitExitFullscreen(); else if (window.document.msExitFullscreen) window.document.msExitFullscreen(); break; } var isJotForm = (e.origin.indexOf("jotform") > -1) ? true : false; if(isJotForm && "contentWindow" in iframe && "postMessage" in iframe.contentWindow) { var urls = {"docurl":encodeURIComponent(document.URL),"referrer":encodeURIComponent(document.referrer)}; iframe.contentWindow.postMessage(JSON.stringify({"type":"urls","value":urls}), "*"); } }; window.isPermitted = function(originUrl, whitelisted_domains) { var url = document.createElement('a'); url.href = originUrl; var hostname = url.hostname; var result = false; if( typeof hostname !== 'undefined' ) { whitelisted_domains.forEach(function(element) { if( hostname.slice((-1 * element.length - 1)) === '.'.concat(element) || hostname === element ) { result = true; } }); return result; } }; if (window.addEventListener) { window.addEventListener("message", handleIFrameMessage, false); } else if (window.attachEvent) { window.attachEvent("onmessage", handleIFrameMessage); } </script> </div> </div> <div class="elementor-element elementor-element-7c9513d elementor-widget elementor-widget-html" data-id="7c9513d" data-element_type="widget" data-settings="{"sticky_offset":10,"sticky_parent":"yes","sticky":"top","sticky_on":["desktop","tablet","mobile"],"sticky_effects_offset":0}" data-widget_type="html.default"> <div class="elementor-widget-container"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1183579825777021" crossorigin="anonymous"></script> <!-- devx top --> <ins class="adsbygoogle" style="display:inline-block;width:300px;height:600px" data-ad-client="ca-pub-1183579825777021" data-ad-slot="2250810506"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> </div> </div> </div> </section> <section class="elementor-section elementor-top-section elementor-element elementor-element-7ef94119 elementor-hidden-mobile elementor-hidden-tablet elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7ef94119" data-element_type="section"> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-cb0d3b5" data-id="cb0d3b5" data-element_type="column"> <div class="elementor-widget-wrap"> </div> </div> <div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-dcd3813" data-id="dcd3813" data-element_type="column"> <div class="elementor-widget-wrap"> </div> </div> </div> </section> </div> <footer data-elementor-type="footer" data-elementor-id="23300" class="elementor elementor-23300 elementor-location-footer"> <footer class="elementor-section elementor-top-section elementor-element elementor-element-1588a538 elementor-section-height-min-height elementor-section-content-middle elementor-section-full_width elementor-section-height-default elementor-section-items-middle" data-id="1588a538" data-element_type="section" data-settings="{"background_background":"classic"}"> <div class="elementor-container elementor-column-gap-no"> <div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-9d2a788" data-id="9d2a788" data-element_type="column"> <div class="elementor-widget-wrap"> </div> </div> <div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-2e0ce949" data-id="2e0ce949" data-element_type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-4f9ec08 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="4f9ec08" data-element_type="widget" data-widget_type="divider.default"> <div class="elementor-widget-container"> <style>/*! elementor - v3.12.2 - 23-04-2023 */ .elementor-widget-divider{--divider-border-style:none;--divider-border-width:1px;--divider-color:#0c0d0e;--divider-icon-size:20px;--divider-element-spacing:10px;--divider-pattern-height:24px;--divider-pattern-size:20px;--divider-pattern-url:none;--divider-pattern-repeat:repeat-x}.elementor-widget-divider .elementor-divider{display:flex}.elementor-widget-divider .elementor-divider__text{font-size:15px;line-height:1;max-width:95%}.elementor-widget-divider .elementor-divider__element{margin:0 var(--divider-element-spacing);flex-shrink:0}.elementor-widget-divider .elementor-icon{font-size:var(--divider-icon-size)}.elementor-widget-divider .elementor-divider-separator{display:flex;margin:0;direction:ltr}.elementor-widget-divider--view-line_icon .elementor-divider-separator,.elementor-widget-divider--view-line_text .elementor-divider-separator{align-items:center}.elementor-widget-divider--view-line_icon .elementor-divider-separator:after,.elementor-widget-divider--view-line_icon .elementor-divider-separator:before,.elementor-widget-divider--view-line_text .elementor-divider-separator:after,.elementor-widget-divider--view-line_text .elementor-divider-separator:before{display:block;content:"";border-bottom:0;flex-grow:1;border-top:var(--divider-border-width) var(--divider-border-style) var(--divider-color)}.elementor-widget-divider--element-align-left .elementor-divider .elementor-divider-separator>.elementor-divider__svg:first-of-type{flex-grow:0;flex-shrink:100}.elementor-widget-divider--element-align-left .elementor-divider-separator:before{content:none}.elementor-widget-divider--element-align-left .elementor-divider__element{margin-left:0}.elementor-widget-divider--element-align-right .elementor-divider .elementor-divider-separator>.elementor-divider__svg:last-of-type{flex-grow:0;flex-shrink:100}.elementor-widget-divider--element-align-right .elementor-divider-separator:after{content:none}.elementor-widget-divider--element-align-right .elementor-divider__element{margin-right:0}.elementor-widget-divider:not(.elementor-widget-divider--view-line_text):not(.elementor-widget-divider--view-line_icon) .elementor-divider-separator{border-top:var(--divider-border-width) var(--divider-border-style) var(--divider-color)}.elementor-widget-divider--separator-type-pattern{--divider-border-style:none}.elementor-widget-divider--separator-type-pattern.elementor-widget-divider--view-line .elementor-divider-separator,.elementor-widget-divider--separator-type-pattern:not(.elementor-widget-divider--view-line) .elementor-divider-separator:after,.elementor-widget-divider--separator-type-pattern:not(.elementor-widget-divider--view-line) .elementor-divider-separator:before,.elementor-widget-divider--separator-type-pattern:not([class*=elementor-widget-divider--view]) .elementor-divider-separator{width:100%;min-height:var(--divider-pattern-height);-webkit-mask-size:var(--divider-pattern-size) 100%;mask-size:var(--divider-pattern-size) 100%;-webkit-mask-repeat:var(--divider-pattern-repeat);mask-repeat:var(--divider-pattern-repeat);background-color:var(--divider-color);-webkit-mask-image:var(--divider-pattern-url);mask-image:var(--divider-pattern-url)}.elementor-widget-divider--no-spacing{--divider-pattern-size:auto}.elementor-widget-divider--bg-round{--divider-pattern-repeat:round}.rtl .elementor-widget-divider .elementor-divider__text{direction:rtl}.e-con-inner>.elementor-widget-divider,.e-con>.elementor-widget-divider{width:var(--container-widget-width,100%);--flex-grow:var(--container-widget-flex-grow)}</style> <div class="elementor-divider"> <span class="elementor-divider-separator"> </span> </div> </div> </div> <section class="elementor-section elementor-inner-section elementor-element elementor-element-73a9986 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="73a9986" data-element_type="section"> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-7f08930" data-id="7f08930" data-element_type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-269b367 elementor-nav-menu__align-center elementor-nav-menu--dropdown-tablet elementor-nav-menu__text-align-aside elementor-nav-menu--toggle elementor-nav-menu--burger elementor-widget elementor-widget-nav-menu" data-id="269b367" data-element_type="widget" data-settings="{"layout":"horizontal","submenu_icon":{"value":"<i class=\"fas fa-caret-down\"><\/i>","library":"fa-solid"},"toggle":"burger"}" data-widget_type="nav-menu.default"> <div class="elementor-widget-container"> <nav class="elementor-nav-menu--main elementor-nav-menu__container elementor-nav-menu--layout-horizontal e--pointer-underline e--animation-fade"> <ul id="menu-1-269b367" class="elementor-nav-menu"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-23808"><a href="https://www.devx.com/" class="elementor-item">Home</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-23809"><a href="https://www.devx.com/advertise/" class="elementor-item">Advertise</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-23816"><a href="https://www.devx.com/about/" class="elementor-item">About</a></li> </ul> </nav> <div class="elementor-menu-toggle" role="button" tabindex="0" aria-label="Menu Toggle" aria-expanded="false"> <i aria-hidden="true" role="presentation" class="elementor-menu-toggle__icon--open eicon-menu-bar"></i><i aria-hidden="true" role="presentation" class="elementor-menu-toggle__icon--close eicon-close"></i> <span class="elementor-screen-only">Menu</span> </div> <nav class="elementor-nav-menu--dropdown elementor-nav-menu__container" aria-hidden="true"> <ul id="menu-2-269b367" class="elementor-nav-menu"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-23808"><a href="https://www.devx.com/" class="elementor-item" tabindex="-1">Home</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-23809"><a href="https://www.devx.com/advertise/" class="elementor-item" tabindex="-1">Advertise</a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-23816"><a href="https://www.devx.com/about/" class="elementor-item" tabindex="-1">About</a></li> </ul> </nav> </div> </div> </div> </div> <div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-21928d3" data-id="21928d3" data-element_type="column"> <div class="elementor-widget-wrap"> </div> </div> <div class="elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-869862d" data-id="869862d" data-element_type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-5d5f4dc5 e-grid-align-left elementor-shape-rounded elementor-grid-0 elementor-widget elementor-widget-social-icons" data-id="5d5f4dc5" data-element_type="widget" data-widget_type="social-icons.default"> <div class="elementor-widget-container"> <style>/*! elementor - v3.12.2 - 23-04-2023 */ .elementor-widget-social-icons.elementor-grid-0 .elementor-widget-container,.elementor-widget-social-icons.elementor-grid-mobile-0 .elementor-widget-container,.elementor-widget-social-icons.elementor-grid-tablet-0 .elementor-widget-container{line-height:1;font-size:0}.elementor-widget-social-icons:not(.elementor-grid-0):not(.elementor-grid-tablet-0):not(.elementor-grid-mobile-0) .elementor-grid{display:inline-grid}.elementor-widget-social-icons .elementor-grid{grid-column-gap:var(--grid-column-gap,5px);grid-row-gap:var(--grid-row-gap,5px);grid-template-columns:var(--grid-template-columns);justify-content:var(--justify-content,center);justify-items:var(--justify-content,center)}.elementor-icon.elementor-social-icon{font-size:var(--icon-size,25px);line-height:var(--icon-size,25px);width:calc(var(--icon-size, 25px) + (2 * var(--icon-padding, .5em)));height:calc(var(--icon-size, 25px) + (2 * var(--icon-padding, .5em)))}.elementor-social-icon{--e-social-icon-icon-color:#fff;display:inline-flex;background-color:#69727d;align-items:center;justify-content:center;text-align:center;cursor:pointer}.elementor-social-icon i{color:var(--e-social-icon-icon-color)}.elementor-social-icon svg{fill:var(--e-social-icon-icon-color)}.elementor-social-icon:last-child{margin:0}.elementor-social-icon:hover{opacity:.9;color:#fff}.elementor-social-icon-android{background-color:#a4c639}.elementor-social-icon-apple{background-color:#999}.elementor-social-icon-behance{background-color:#1769ff}.elementor-social-icon-bitbucket{background-color:#205081}.elementor-social-icon-codepen{background-color:#000}.elementor-social-icon-delicious{background-color:#39f}.elementor-social-icon-deviantart{background-color:#05cc47}.elementor-social-icon-digg{background-color:#005be2}.elementor-social-icon-dribbble{background-color:#ea4c89}.elementor-social-icon-elementor{background-color:#d30c5c}.elementor-social-icon-envelope{background-color:#ea4335}.elementor-social-icon-facebook,.elementor-social-icon-facebook-f{background-color:#3b5998}.elementor-social-icon-flickr{background-color:#0063dc}.elementor-social-icon-foursquare{background-color:#2d5be3}.elementor-social-icon-free-code-camp,.elementor-social-icon-freecodecamp{background-color:#006400}.elementor-social-icon-github{background-color:#333}.elementor-social-icon-gitlab{background-color:#e24329}.elementor-social-icon-globe{background-color:#69727d}.elementor-social-icon-google-plus,.elementor-social-icon-google-plus-g{background-color:#dd4b39}.elementor-social-icon-houzz{background-color:#7ac142}.elementor-social-icon-instagram{background-color:#262626}.elementor-social-icon-jsfiddle{background-color:#487aa2}.elementor-social-icon-link{background-color:#818a91}.elementor-social-icon-linkedin,.elementor-social-icon-linkedin-in{background-color:#0077b5}.elementor-social-icon-medium{background-color:#00ab6b}.elementor-social-icon-meetup{background-color:#ec1c40}.elementor-social-icon-mixcloud{background-color:#273a4b}.elementor-social-icon-odnoklassniki{background-color:#f4731c}.elementor-social-icon-pinterest{background-color:#bd081c}.elementor-social-icon-product-hunt{background-color:#da552f}.elementor-social-icon-reddit{background-color:#ff4500}.elementor-social-icon-rss{background-color:#f26522}.elementor-social-icon-shopping-cart{background-color:#4caf50}.elementor-social-icon-skype{background-color:#00aff0}.elementor-social-icon-slideshare{background-color:#0077b5}.elementor-social-icon-snapchat{background-color:#fffc00}.elementor-social-icon-soundcloud{background-color:#f80}.elementor-social-icon-spotify{background-color:#2ebd59}.elementor-social-icon-stack-overflow{background-color:#fe7a15}.elementor-social-icon-steam{background-color:#00adee}.elementor-social-icon-stumbleupon{background-color:#eb4924}.elementor-social-icon-telegram{background-color:#2ca5e0}.elementor-social-icon-thumb-tack{background-color:#1aa1d8}.elementor-social-icon-tripadvisor{background-color:#589442}.elementor-social-icon-tumblr{background-color:#35465c}.elementor-social-icon-twitch{background-color:#6441a5}.elementor-social-icon-twitter{background-color:#1da1f2}.elementor-social-icon-viber{background-color:#665cac}.elementor-social-icon-vimeo{background-color:#1ab7ea}.elementor-social-icon-vk{background-color:#45668e}.elementor-social-icon-weibo{background-color:#dd2430}.elementor-social-icon-weixin{background-color:#31a918}.elementor-social-icon-whatsapp{background-color:#25d366}.elementor-social-icon-wordpress{background-color:#21759b}.elementor-social-icon-xing{background-color:#026466}.elementor-social-icon-yelp{background-color:#af0606}.elementor-social-icon-youtube{background-color:#cd201f}.elementor-social-icon-500px{background-color:#0099e5}.elementor-shape-rounded .elementor-icon.elementor-social-icon{border-radius:10%}.elementor-shape-circle .elementor-icon.elementor-social-icon{border-radius:50%}</style> <div class="elementor-social-icons-wrapper elementor-grid"> <span class="elementor-grid-item"> <a class="elementor-icon elementor-social-icon elementor-social-icon-linkedin elementor-repeater-item-5c0ce3c" href="https://www.linkedin.com/company/devx" target="_blank"> <span class="elementor-screen-only">Linkedin</span> <i class="fab fa-linkedin"></i> </a> </span> <span class="elementor-grid-item"> <a class="elementor-icon elementor-social-icon elementor-social-icon-twitter elementor-repeater-item-828f132" href="https://twitter.com/DevX_Com" target="_blank"> <span class="elementor-screen-only">Twitter</span> <i class="fab fa-twitter"></i> </a> </span> </div> </div> </div> </div> </div> </div> </section> <div class="elementor-element elementor-element-6963de5 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="6963de5" data-element_type="widget" data-widget_type="divider.default"> <div class="elementor-widget-container"> <div class="elementor-divider"> <span class="elementor-divider-separator"> </span> </div> </div> </div> </div> </div> </div> </footer> <section class="elementor-section elementor-top-section elementor-element elementor-element-a4f01a6 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="a4f01a6" data-element_type="section"> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-a1bc5b1" data-id="a1bc5b1" data-element_type="column"> <div class="elementor-widget-wrap"> </div> </div> <div class="elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-e4f110b" data-id="e4f110b" data-element_type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-4a914653 elementor-widget elementor-widget-heading" data-id="4a914653" data-element_type="widget" data-widget_type="heading.default"> <div class="elementor-widget-container"> <p class="elementor-heading-title elementor-size-default">©2023 Copyright DevX - All Rights Reserved. Registration or use of this site constitutes acceptance of our Terms of Service and Privacy Policy.</p> </div> </div> <div class="elementor-element elementor-element-d2cf216 elementor-widget elementor-widget-text-editor" data-id="d2cf216" data-element_type="widget" data-widget_type="text-editor.default"> <div class="elementor-widget-container"> <style>/*! elementor - v3.12.2 - 23-04-2023 */ .elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}</style> <p><strong><a href="https://www.devx.com/sitemap/">Sitemap</a></strong></p> </div> </div> </div> </div> </div> </section> </footer> <link rel='stylesheet' id='elementor-icons-fa-regular-css' href='https://www.devx.com/wp-content/plugins/elementor/assets/lib/font-awesome/css/regular.min.css?ver=5.15.3' type='text/css' media='all' /> <link rel='stylesheet' id='e-animations-css' href='https://www.devx.com/wp-content/plugins/elementor/assets/lib/animations/animations.min.css?ver=3.12.2' type='text/css' media='all' /> <script type='text/javascript' src='https://www.devx.com/wp-content/themes/devxnew/assets/js/hello-frontend.min.js?ver=1.0.0' id='hello-theme-frontend-js'></script> <script type='text/javascript' src='https://www.devx.com/wp-content/plugins/elementor-pro/assets/lib/smartmenus/jquery.smartmenus.min.js?ver=1.0.1' id='smartmenus-js'></script> <script type='text/javascript' src='https://www.devx.com/wp-includes/js/imagesloaded.min.js?ver=4.1.4' id='imagesloaded-js'></script> <script type='text/javascript' src='https://www.devx.com/wp-content/plugins/elementor-pro/assets/js/webpack-pro.runtime.min.js?ver=3.12.3' id='elementor-pro-webpack-runtime-js'></script> <script type='text/javascript' src='https://www.devx.com/wp-content/plugins/elementor/assets/js/webpack.runtime.min.js?ver=3.12.2' id='elementor-webpack-runtime-js'></script> <script type='text/javascript' src='https://www.devx.com/wp-content/plugins/elementor/assets/js/frontend-modules.min.js?ver=3.12.2' id='elementor-frontend-modules-js'></script> <script type='text/javascript' src='https://www.devx.com/wp-includes/js/dist/vendor/wp-polyfill-inert.min.js?ver=3.1.2' id='wp-polyfill-inert-js'></script> <script type='text/javascript' src='https://www.devx.com/wp-includes/js/dist/vendor/regenerator-runtime.min.js?ver=0.13.11' id='regenerator-runtime-js'></script> <script type='text/javascript' src='https://www.devx.com/wp-includes/js/dist/vendor/wp-polyfill.min.js?ver=3.15.0' id='wp-polyfill-js'></script> <script type='text/javascript' src='https://www.devx.com/wp-includes/js/dist/hooks.min.js?ver=4169d3cf8e8d95a3d6d5' id='wp-hooks-js'></script> <script type='text/javascript' src='https://www.devx.com/wp-includes/js/dist/i18n.min.js?ver=9e794f35a71bb98672ae' id='wp-i18n-js'></script> <script type='text/javascript' id='wp-i18n-js-after'> wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); </script> <script type='text/javascript' id='elementor-pro-frontend-js-before'> var ElementorProFrontendConfig = {"ajaxurl":"https:\/\/www.devx.com\/wp-admin\/admin-ajax.php","nonce":"8fa96fe1ad","urls":{"assets":"https:\/\/www.devx.com\/wp-content\/plugins\/elementor-pro\/assets\/","rest":"https:\/\/www.devx.com\/wp-json\/"},"shareButtonsNetworks":{"facebook":{"title":"Facebook","has_counter":true},"twitter":{"title":"Twitter"},"linkedin":{"title":"LinkedIn","has_counter":true},"pinterest":{"title":"Pinterest","has_counter":true},"reddit":{"title":"Reddit","has_counter":true},"vk":{"title":"VK","has_counter":true},"odnoklassniki":{"title":"OK","has_counter":true},"tumblr":{"title":"Tumblr"},"digg":{"title":"Digg"},"skype":{"title":"Skype"},"stumbleupon":{"title":"StumbleUpon","has_counter":true},"mix":{"title":"Mix"},"telegram":{"title":"Telegram"},"pocket":{"title":"Pocket","has_counter":true},"xing":{"title":"XING","has_counter":true},"whatsapp":{"title":"WhatsApp"},"email":{"title":"Email"},"print":{"title":"Print"}},"facebook_sdk":{"lang":"en_US","app_id":""},"lottie":{"defaultAnimationUrl":"https:\/\/www.devx.com\/wp-content\/plugins\/elementor-pro\/modules\/lottie\/assets\/animations\/default.json"}}; </script> <script type='text/javascript' src='https://www.devx.com/wp-content/plugins/elementor-pro/assets/js/frontend.min.js?ver=3.12.3' id='elementor-pro-frontend-js'></script> <script type='text/javascript' src='https://www.devx.com/wp-content/plugins/elementor/assets/lib/waypoints/waypoints.min.js?ver=4.0.2' id='elementor-waypoints-js'></script> <script type='text/javascript' src='https://www.devx.com/wp-includes/js/jquery/ui/core.min.js?ver=1.13.2' id='jquery-ui-core-js'></script> <script type='text/javascript' id='elementor-frontend-js-before'> var elementorFrontendConfig = {"environmentMode":{"edit":false,"wpPreview":false,"isScriptDebug":false},"i18n":{"shareOnFacebook":"Share on Facebook","shareOnTwitter":"Share on Twitter","pinIt":"Pin it","download":"Download","downloadImage":"Download image","fullscreen":"Fullscreen","zoom":"Zoom","share":"Share","playVideo":"Play Video","previous":"Previous","next":"Next","close":"Close"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Mobile Portrait","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Landscape","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tablet Portrait","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet Landscape","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"Widescreen","value":2400,"default_value":2400,"direction":"min","is_enabled":false}}},"version":"3.12.2","is_static":false,"experimentalFeatures":{"e_dom_optimization":true,"e_optimized_assets_loading":true,"e_optimized_css_loading":true,"a11y_improvements":true,"additional_custom_breakpoints":true,"theme_builder_v2":true,"hello-theme-header-footer":true,"landing-pages":true,"page-transitions":true,"notes":true,"loop":true,"form-submissions":true,"e_scroll_snap":true},"urls":{"assets":"https:\/\/www.devx.com\/wp-content\/plugins\/elementor\/assets\/"},"swiperClass":"swiper-container","settings":{"page":[],"editorPreferences":[]},"kit":{"body_background_background":"classic","active_breakpoints":["viewport_mobile","viewport_tablet"],"global_image_lightbox":"yes","lightbox_enable_counter":"yes","lightbox_enable_fullscreen":"yes","lightbox_enable_zoom":"yes","lightbox_enable_share":"yes","lightbox_title_src":"title","lightbox_description_src":"description","hello_header_logo_type":"logo","hello_header_menu_layout":"horizontal","hello_footer_logo_type":"logo"},"post":{"id":10939,"title":"Convert%20Schemas%20to%20Documents%20-%20DevX","excerpt":"","featuredImage":"https:\/\/www.devx.com\/wp-content\/uploads\/2022\/02\/thumbnail.jpg"}}; </script> <script type='text/javascript' src='https://www.devx.com/wp-content/plugins/elementor/assets/js/frontend.min.js?ver=3.12.2' id='elementor-frontend-js'></script> <script type='text/javascript' src='https://www.devx.com/wp-content/plugins/elementor-pro/assets/js/elements-handlers.min.js?ver=3.12.3' id='pro-elements-handlers-js'></script> <script type='text/javascript' src='https://www.devx.com/wp-content/plugins/elementor-pro/assets/lib/sticky/jquery.sticky.min.js?ver=3.12.3' id='e-sticky-js'></script> </body> </html> <!-- Dynamic page generated in 1.153 seconds. --> <!-- Cached page generated by WP-Super-Cache on 2023-06-04 00:42:00 --> <!-- Compression = gzip -->