To access XML data while building a report, you can read XML into a DataSet and pass it to the assembler as a data source. However, if you cannot specify an XML schema while loading XML into a DataSet, all attributes and text values of XML elements are loaded as strings. Thus, it becomes impossible, for example, to use arithmetic operations on numbers or to specify custom date-time and numeric formats to output corresponding values, because all of them are treated as strings.
To overcome this limitation, pass an XmlDataSource instance to the assembler as a data source instead. Even when an XML schema is not provided, XmlDataSource recognizes values of the following types by their string representations:
Integer
Long
Double
Boolean
Date
Warning
For recognition of data types to work, string representations of corresponding attributes and text values of XML elements must be formed using invariant culture settings.
An XmlDataSource can be created from a file path or a Java InputStream, optionally together with an XML schema and XmlDataLoadOptions.
Treating a top-level XML element that contains only a sequence of elements of the same type
In template documents, if a top-level XML element contains only a sequence of elements of the same type, an XmlDataSource instance should be treated in the same way as if it was a DataTable instance (see “Using Data Sources” for more information).
Name: John Doe, Age: 30, Date of Birth: 01.04.1989
Name: Jane Doe, Age: 27, Date of Birth: 31.01.1992
Name: John Smith, Age: 51, Date of Birth: 08.03.1968
Average age: 36.0
Warning
Using a custom date-time format and an extension method involving arithmetic in the template is possible because text values of the Birth and Age XML elements are automatically converted to a date and an integer respectively, even in the absence of an XML schema.
Treating a top-level XML element that contains attributes or nested elements of different types
If a top-level XML element contains attributes or nested elements of different types, an XmlDataSource instance should be treated in template documents in the same way as if it was a DataRow instance (see “Using Data Sources” for more information) as shown in the following example.
Name: John Doe, Age: 30, Date of Birth:
01.04.1989
Children:
Ann Doe
Charles Doe
Warning
To reference a sequence of repeated simple-type XML elements with the same name, use the elements’ name itself (for example, “Child”) in a template document, and the same name with the “_Text” suffix (for example, “Child_Text”) to reference the text value of one of these elements.
The complete example
The following example sums up typical scenarios involving nested complex-type XML elements.
constgroupdocs=require('@groupdocs/groupdocs.assembly');// Source template and destination report
consttemplatePath="SimpleDatasetDemo.docx";constreportPath="SimpleXMLDSDemo Out.docx";// Load the XML data
constdataSource=newgroupdocs.XmlDataSource("Managers.xml");constdataSourceInfo=newgroupdocs.DataSourceInfo(dataSource,"managers");// Assemble the document
constassembler=newgroupdocs.DocumentAssembler();assembler.assembleDocument(templatePath,reportPath,dataSourceInfo);process.exit(0);
Result document
Manager: John Smith
Contracts:
- A Company ($1200000)
- B Ltd. ($750000)
- C & D ($350000)
Manager: Tony Anderson
Contracts:
- E Corp. ($650000)
- F & Partners ($550000)
Manager: July James
Contracts:
- G & Co. ($350000)
- H Group ($250000)
- I & Sons ($100000)
- J Ent. ($100000)