Altova MapForce 2023 Enterprise Edition

Cambiar tipo de datos de entrada/salida de la asignación de forma programática

Inicio Anterior Inicio Siguiente

Después de generar código Java o C# con MapForce tiene la opción de cambiar el tipo de datos de entrada o salida de la asignación; para ello basta con editar el código generado. Esto quiere decir que puede usar como parámetros de asignación objetos de tipos distintos a los que se generan por defecto. Por ejemplo, en lugar de que la asignación lea los datos de entrada de un archivo guardado en disco puede usar una cadena de texto o un objeto se secuencia como entrada. Esta opción solo está disponible para el código generado en C# o Java.

 

Puede consultar los tipos de objetos que puede usar como entrada o salida en la primera columna de la tabla siguiente. El resto de columnas indica qué formatos de datos son compatibles con ese tipo en concreto. Para leer una definición más precisa de cada uno de los tipo consulte el punto "Definiciones de tipos" más abajo.

 


XML

JSON*

Microsoft Excel*

EDI (incl. X12, HL7)*

FlexText*

CSV/Texto

Archivos

Secuencias

Cadenas

Escritor/lector

Documentos DOM

 

* Formatos compatibles con la edición MapForce Enterprise Edition solamente.

Para cambiar el tipo de datos de entrada o de salida de una asignación:

1.Genere código C# o Java desde una asignación.

2.En el código generado encuentre la llamada al método run (en Java) o Run (en C#):

 

a.Si está usando C#, abra el archivo MappingConsole.cs.

b.Si está usando Java, abra el archivo MappingConsole.java (consola) o el archivo MappingFrame.java (IGU).

 

Nota:el nombre del archivo puede ser distinto si cambió el nombre de la aplicación en la configuración de la asignación. Por ejemplo, si cambió el nombre a "MyApp", el nombre del archivo generado será, respectivamente, MyAppConsole.js, MyAppConsole.java y MyAppFrame.java.

 

3.Cree una instancia del tipo que requiera (consulte el punto "Definiciones de tipos").

4.Indique los objetos declarados como parámetros al método run (en Java) o Run (en C#), como se puede ver en el ejemplo siguiente.

 

El método run es el método más importante de las clases de asignación que se generan. Tiene un parámetro por cada componente de origen o destino estático de la asignación y un parámetro final para el componente de salida. Si una asignación contiene componentes que procesan varios archivos de forma dinámica, los parámetros correspondientes no aparecen en el código generado porque en este caso los nombres de los archivos se procesan de forma dinámica dentro de la asignación.

 

Definiciones de tipos

En C#, los tipos que puede usar como parámetros del método Run son clases que se definen en el espacio de nombres Altova.IO. Las clases base son Altova.IO.Input y Altova.IO.Output respectivamente.

Tipos C#

Archivos

Altova.IO.FileInput(string nombreArchivo)

Altova.IO.FileOutput(string nombreArchivo)

Secuencias

Altova.IO.StreamInput(System.IO.Stream secuencia)

Altova.IO.StreamOutput(System.IO.Stream secuencia)

Cadenas

Altova.IO.StringInput(string contenido)

Altova.IO.StringOutput(System.Text.StringBuilder generadorCadenas)

Escritor/lector

Altova.IO.ReaderInput(System.IO.TextReader lector)

Altova.IO.WriterOutput(System.IO.TextWriter escritor)

Documentos DOM

Altova.IO.DocumentInput(System.Xml.XmlDocument documento)

Altova.IO.DocumentOutput(System.Xml.XmlDocument documento)

 

En Java, los tipos que puede usar como parámetros del método run son clases que se definen en el paquete com.altova.io. Las clases base son com.altova.io.Input y com.altova.io.Output respectivamente.

Tipos Java

Archivos

com.altova.io.FileInput(String nombreArchivo)
com.altova.io.FileOutput(String nombreArchivo)

Secuencias

com.altova.io.StreamInput(java.io.InputStream secuencia)

com.altova.io.FileOutput(String nombreArchivo)

Cadenas

Altova.IO.StringInput(string contenido)

com.altova.io.StringOutput()

Escritor/lector

com.altova.io.ReaderInput(java.io.Reader lector)

com.altova.io.WriterOutput(java.io.Writer escritor)

Documentos DOM

com.altova.io.DocumentOutput(org.w3c.dom.Document documento)

com.altova.io.DocumentOutput(org.w3c.dom.Document documento)

 

Ejemplo

En este ejemplo usaremos la asignación ConvertProducts.mfd para ilustrar cómo cambiar el tipo de datos de entrada y salida de forma programática. Después de instalar MapForce y ejecutarlo al menos una vez puede encontrar esta asignación en el directorio: C:\Usuarios\<usuario>\Documentos\Altova\MapForce2023\MapForceExamples\Tutorials.

cg_input_output_01

ConvertProducts.mfd

Como se ve más arriba, la asignación convierte los datos de origen de un document XML en otro documento XML. En este caso los objetivos son dos:

 

1.Generar código de programa Java y C# desde esta asignación.

2.Cambiar el tipo de datos del componente de entrada a cadena de texto.

3.Cambiar el tipo de datos del componente de destino a un escritor de cadenas.

 

Para generar el código de programa, abra la asignación ConvertProducts.mfd y ejecute el comando Archivo | Generar código en | C# (o Java) En este ejemplo asumimos que la asignación mantiene la configuración predeterminada (ConvertProducts.mfd).

cg_input_output_02

En este ejemplo el código generado se escribe en los directorios de destino siguientes (puede cambiar las rutas si quiere):

 

C:\codegen\cs\ConvertProducts, para C#

C:\codegen\java\ConvertProducts, para Java

 

Una vez haya generado el código, abra MappingConsole.cs (en C#) o MappingConsole.java (en Java) y busque estas líneas:

C#

Altova.IO.Input Products2Source = Altova.IO.StreamInput.createInput("Products.xml");
Altova.IO.Output ProductValuePairs2Target = new Altova.IO.FileOutput("ProductValuePairs.xml");

Java

com.altova.io.Input Products2Source = com.altova.io.StreamInput.createInput("Products.xml");
com.altova.io.Output ProductValuePairs2Target = new com.altova.io.FileOutput("ProductValuePairs.xml");

 

Convierta las líneas anteriores en comentario y cambie el código como sigue:

C#

//Altova.IO.Input Products2Source = Altova.IO.StreamInput.createInput("Products.xml");
//Altova.IO.Output ProductValuePairs2Target = new Altova.IO.FileOutput("ProductValuePairs.xml");
 
Altova.IO.Input Products2Source = new Altova.IO.StringInput("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\" +
                                      "<products xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"products.xsd\">\" +
                                      "   <product>\" +
                                      "      <id>100</id>\" +
                                      "      <color>blue</color>\" +
                                      "      <size>XXL</size>\" +
                                      "   </product>\" +
                                      "</products>\");
                   
System.IO.StringWriter writer = new System.IO.StringWriter(new System.Text.StringBuilder());
Altova.IO.Output ProductValuePairs2Target = new Altova.IO.WriterOutput(writer);
 
try
{
  MappingMapToProductValuePairsObject.Run(Products2Source, ProductValuePairs2Target);
 
  // Print out the writer object
  Console.Write(writer.ToString());
}
finally
{
  Products2Source.Close();
  ProductValuePairs2Target.Close();

}

Java

//com.altova.io.Input Products2Source = com.altova.io.StreamInput.createInput("Products.xml");
//com.altova.io.Output ProductValuePairs2Target = new com.altova.io.FileOutput("ProductValuePairs.xml");
       
com.altova.io.Input Products2Source = new com.altova.io.StringInput("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\" +
              "<products xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"products.xsd\">\" +
              "   <product>\" +
              "      <id>100</id>\" +
              "      <color>blue</color>\" +
              "      <size>XXL</size>\" +
              "   </product>\" +
              "</products>\");
       
java.io.StringWriter writer = new java.io.StringWriter();
com.altova.io.Output ProductValuePairs2Target = new com.altova.io.WriterOutput(writer);
 
try {
  MappingMapToProductValuePairsObject.run(Products2Source, ProductValuePairs2Target);

 
  // Print out the writer object
  System.out.print(writer.toString());
 
  } finally {
    (Products2Source).close();
    ProductValuePairs2Target.close();
}

 

En los fragmentos de código C# y Java anteriores ocurre lo siguiente:

 

Las dos líneas originales que indican la entrada y la salida del método run ahora son comentarios. Esto quiere decir que la asignación ya no lee datos de Products.xml. De hecho, ni siquiera necesitamos copiar este archivo en el directorio de trabajo del programa.

El tipo Products2Source se declara como un StringInput que indica el contenido del archivo XML que se quiere procesar.

El tipo ProductValuePairs2Target se declara como un tipo WriterOutput que toma un escritor de cadenas como argumento.

Cuando la asignación ha terminado de ejecutarse, el contenido del escritor de cadenas se envía a la consola.

 

Normas de uso para secuencias y objetos escritor/lector

Al usar secuencias binarias u objetos lector/escritor como entrada o salida de la asignación debe tener en cuenta que:

 

Se supone que los objetos de secuencia binaria y los objetos lector/escritor se abren y están listos antes de llamar al método run.

Por defecto el método run cierra la secuencia cuando se termina. Para evitar este comportamiento basta con insertar (o convertir de comentario en código) esta línea antes de llamar al método run:

C#

MappingMapToSomething.CloseObjectsAfterRun = false;

Java

MappingMapToSomething.setCloseObjectsAfterRun(false);

 

Nota:asegúrese de que cambia el nombre MappingMapToSomething por el del objeto de asignación según el código generado.

 

Normas de uso para cadenas de texto

En Java el constructor de StringOutput no toma ningún argumento. Para acceder al contenido de cadena que produce la asignación puede usar el método getString(), por ejemplo:

Java

com.altova.io.Input Products2Source = com.altova.io.StreamInput.createInput("Products.xml");
com.altova.io.StringOutput ProductValuePairs2Target = new com.altova.io.StringOutput();
       
try {
  // Run the mapping
  MappingMapToProductValuePairsObject.run(Products2Source, ProductValuePairs2Target);
  // Get the string object
  String str = ProductValuePairs2Target.getString().toString();
}

 

En C#, el constructor de StringOutput toma un parámetro de tipo StringBuilder que debe declarar de antemano. Si el argumento StringBuilder ya contiene datos, el resultado de la asignación se le anexa.

C#

Altova.IO.Input Products2Source = Altova.IO.StreamInput.createInput("Products.xml");
System.Text.StringBuilder sb = new System.Text.StringBuilder();
Altova.IO.Output ProductValuePairs2Target = new Altova.IO.StringOutput(sb);
 
try
{
  // Run the mapping
  MappingMapToProductValuePairsObject.Run(Products2Source, ProductValuePairs2Target);
  // Get the string output
  String str = sb.ToString();
}

 

Para ejecutar estos fragmentos de código puede usar el mismo proyecto generado que en el ejemplo anterior. Sin embargo, debe asegurarse de que copia el archivo de Products.xml de C:\Users\<username>\Documents\Altova\MapForce2023\MapForceExamples\Tutorials\ en el directorio de trabajo de su programa, ya que el código de la asignación lee datos de ese archivo.

 

Normas de uso para documentos DOM

Cuando use documentos DOM como entrada o salida de una asignación debe tener en cuenta que:

 

La instancia del documento dada como parámetro al constructor DocumentOutput debe estar vacía.

Después de llamar a run el documento DOM que genera el constructor de DocumentOutput ya contiene el resultado de la asignación y puede manipular el documento como quiera.

© 2017-2023 Altova GmbH