Provides the classes necessary to compile DFDL schemas, parse and
unparse files using the compiled objects, and retrieve results and
parsing diagnostics
Provides the classes necessary to compile DFDL schemas, parse and
unparse files using the compiled objects, and retrieve results and
parsing diagnostics
val c = Daffodil.compiler()
val pf = c.compileFile(file)
val dp = pf.onPath("/")
The DataProcessor provides the necessary functions to parse and unparse
data, returning a ParseResult or UnparseResult, respectively. These
contain information about the parse/unparse, such as whether or not the
processing succeeded any diagnostic information.
val scalaOutputter = new ScalaXMLInfosetOutputter()
files.foreach { f => {
outputter.reset
val pr = dp.parse(f, scalaOutputter)
val node = scalaOutputter.getResult
}}
Unparse
The same DataProcessor used for parse can be used to unparse an infoset
via the DataProcessor#unparse(input* method. An infoset.InfosetInputter
provides the infoset to unparse, with the unparsed data written to the
provided java.nio.channels.WritableByteChannel. For example:
val inputter = new ScalaXMLInfosetInputter(node)
val ur = dp.unparse(inputter, wbc)
Failures and Diagnostics
It is possible that failures could occur during the creation of the
ProcessorFactory, DataProcessor, or ParseResult. However, rather than
throwing an exception on error (e.g. invalid DFDL schema, parse
error, etc), these classes extend WithDiagnostics, which is used to
determine if an error occurred, and any diagnostic information (see
Diagnostic) related to the step. Thus, before continuing, one must check
WithDiagnostics#isError. For example:
val pf = c.compile(file)
if (pf.isError()) {
val diags = pf.getDiagnostics()
diags.foreach { d =>
System.out.println(d.toString())
}
return -1;
}
Saving and Reloading Parsers
In some cases, it may be beneficial to save a parser and reload it.
For example, when starting up, it may be quicker to reload an
already compiled parser than to compile it from scratch. To save a
DataProcessor:
Provides the classes necessary to compile DFDL schemas, parse and unparse files using the compiled objects, and retrieve results and parsing diagnostics
Overview
The Daffodil object is a factory object to create a Compiler. The Compiler provides a method to compils a provided DFDL schema into a ProcessorFactory, which creates a DataProcessor:
The DataProcessor provides the necessary functions to parse and unparse data, returning a ParseResult or UnparseResult, respectively. These contain information about the parse/unparse, such as whether or not the processing succeeded any diagnostic information.
Parse
The DataProcessor#parse(input:java\.nio\.channels\.ReadableByteChannel,output:edu\.illinois\.ncsa\.daffodil\.sapi\.infoset\.InfosetOutputter)* method accepts input data to parse in the form of a java.nio.channels.ReadableByteChannel and an infoset.InfosetOutputter to determine the output representation of the infoset (e.g. Scala XML Nodes, JDOM2 Documents, etc.):
The DataProcessor#parse(input:java\.nio\.channels\.ReadableByteChannel,output:edu\.illinois\.ncsa\.daffodil\.sapi\.infoset\.InfosetOutputter)* method is thread-safe and may be called multiple times without the need to create other data processors. However, infoset.InfosetOutputter's are not thread safe, requiring a unique instance per thread. An infoset.InfosetOutputter should call infoset.InfosetOutputter#reset before reuse (or a new one should be allocated). For example:
Unparse
The same DataProcessor used for parse can be used to unparse an infoset via the DataProcessor#unparse(input* method. An infoset.InfosetInputter provides the infoset to unparse, with the unparsed data written to the provided java.nio.channels.WritableByteChannel. For example:
Failures and Diagnostics
It is possible that failures could occur during the creation of the ProcessorFactory, DataProcessor, or ParseResult. However, rather than throwing an exception on error (e.g. invalid DFDL schema, parse error, etc), these classes extend WithDiagnostics, which is used to determine if an error occurred, and any diagnostic information (see Diagnostic) related to the step. Thus, before continuing, one must check WithDiagnostics#isError. For example:
Saving and Reloading Parsers
In some cases, it may be beneficial to save a parser and reload it. For example, when starting up, it may be quicker to reload an already compiled parser than to compile it from scratch. To save a DataProcessor:
And to restore a saved DataProcessor: