Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Microsoft InfoPath admite enlazar un control Cuadro de texto enriquecido en un formulario a un elemento XML recibido desde un servicio web, así como enviar datos desde un control de cuadro de texto enriquecido a un elemento XML a través de un servicio web. El elemento debe tener el formato de Lenguaje de marcado de hipertexto extensible (XHTML). Por ejemplo, el esquema de un elemento denominado MyRichTextElement
que contiene texto enriquecido tendría la siguiente definición de esquema XML:
<xsd:element name="MyRichTextElement">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:any namespace="https://www.w3.org/1999/xhtml" processContents="lax"
minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Antes de poder vincular un control Cuadro de texto enriquecido al elemento XHTML, el elemento se debe ajustar con un nodo contenedor; este nodo contenedor puede pertenecer a cualquier espacio de nombres arbitrario. El nodo contenedor puede tener el siguiente aspecto:
<xhtmlNode xmlns="https:// someNamespace">
<div xmlns="https://www.w3.org/1999/xhtml">Your rich text here</div>
</xhtmlNode>
Este tema describe el proceso de creación de un servicio web que puede enviar y recibir XHTML y cómo usar InfoPath para el vínculo con los parámetros del servicio web. Este tema no proporciona instrucciones detalladas sobre cómo crear este servicio web. Se supone que ya está familiarizado con el trabajo con servicios web.
Cómo diseñar un servicio web para recibir y enviar XHTML
El servicio web de ejemplo almacena los datos XHTML que envía y recibe en un archivo XML del servidor. Este archivo tiene el nombre out.xml, actúa como origen de datos que almacena los datos XHTML. Hay dos métodos web que se expondrán para permitir que una aplicación cliente interface con el origen de datos XHTML: getXhtml
y setXhtml
. El getXhtml
método Del servicio web devuelve un XmlNode que contiene el XHTML que se puede enlazar a un control de cuadro de texto enriquecido de InfoPath. El setXhtml
método de servicio web acepta un XmlNode como los datos que se almacenarán en el archivo out.xml.
Nota:
[!NOTA] Estos métodos web requieren instrucciones using que hagan referencia a los espacios de nombres System.IO y System.Xml.
El getXhtml
método de servicio web intenta cargar los datos XML que se devolverán desde el archivo out.xml en la carpeta Datos de la unidad C. Si se produce un error, porque no se encuentra el archivo o no contiene XML válido, el método devolverá un elemento HTML DIV vacío que haga referencia al espacio de nombres XHTML.
[WebMethod]
public XmlNode getXhtml()
{
// This is the returned XmlDocument upon Query from InfoPath
XmlDocument document = new XmlDocument();
// Create a wrapping node with the name of the rich text field.
// The "https://someNameSpace" can be any arbitrary namespace
XmlNode richNode = document.CreateNode
(XmlNodeType.Element, "MyRichTextElement", "https://someNameSpace");
// Temporary XmlDocument
XmlDocument tempDocument = new XmlDocument();
try
{
// Read the saved rich text data from the local machine
tempDocument.Load(@"c:\Data\out.xml");
}
catch (XmlException)
{
// If the file does not exist or content is not valid XML
tempDocument.LoadXml("<div xmlns=\"https://www.w3.org/1999/xhtml\"></div>");
}
// Add the file content to the xml
richNode.AppendChild
(document.ImportNode(tempDocument.DocumentElement, true));
return richNode;
}
El setXhtml
método de servicio web acepta XHTML de un control Cuadro de texto enriquecido en un formulario de InfoPath. Puesto que los servicios web no admiten una lista de nodos, cuando se envía un campo de texto enriquecido que contiene varias líneas a un servicio web, éste sólo acepta la primera línea y omite el resto.
El método de ejemplo setXhtml
supone que recibirá un nodo XML de nivel superior, que en la mayoría de los casos se encapsulará en un elemento DIV . Si el XML recibido no contiene un elemento de ajuste, por ejemplo cuando el texto dentro del control de Cuadro de texto enriquecido no tiene formato, este método lo detectará mediante la comprobación de que la propiedad NodeType indique que el XML pasado es un nodo de texto. Si el XML es un nodo de texto, el método crea un elemento DIV y copia los contenidos del nodo de texto en DIV para que DIV contenga un nodo de texto secundario con el texto que se envió al servicio web. El XML recibido por este método se escribe en el archivo out.xml en la carpeta Datos de la unidad C.
Nota:
El método de ejemplo setXhtml
se escribió para aceptar datos XHTML de cualquier tamaño. En la práctica, siempre se debe comprobar cuántos datos se están enviando y definir un límite superior para la cantidad de datos que se pueden enviar.
[WebMethod]
public void setXhtml(XmlNode xn)
{
XmlDocument document = new XmlDocument();
if (xn == null)
{
// If nothing was submitted or the rich text field is empty,
// create a DIV that references the XHTML namespace
XmlElement div = document.CreateElement("div", "https://www.w3.org/1999/xhtml");
// Copy the node to our own XmlDocument
document.AppendChild(div);
}
if (xn.NodeType == XmlNodeType.Text)
{
// If plain text is passed in, wrap it in a DIV
// that references the XHTML namespace
XmlElement div = document.CreateElement("div", "https://www.w3.org/1999/xhtml");
// Copy the text to the DIV.
div.AppendChild(document.ImportNode(xn, true));
// Copy the node to our own XmlDocument
document.AppendChild(div);
}
else
{
// Copy the node to our own XmlDocument
document.AppendChild(document.ImportNode(xn, true));
}
// Save the file to the local machine
document.Save(@"c:\Data\out.xml");
}
Cómo crear un formulario de InfoPath que intercambie datos con el servicio web de ejemplo
Para crear un formulario con el que probar el servicio web de ejemplo, realice los siguientes pasos.
Para crear un formulario que se conecte al servicio web de ejemplo
Abra el diseñador de formularios de InfoPath.
En la ficha Nuevo, haga doble clic en Servicio web en Plantillas de formulario avanzadas.
En el cuadro de diálogo Asistente para la conexión de datos, seleccione Recibir datos y, a continuación, haga clic en Siguiente.
Escriba la dirección del servicio web que contiene los métodos de ejemplo del servicio web y, a continuación, haga clic en Siguiente.
Para el método de recepción, seleccione getXhtml como la operación y, a continuación, haga clic en Siguiente.
El método de servicio web getXHTML no tiene parámetros, por lo tanto, haga clic en Siguiente.
Haga clic en Finalizar.
En la ficha Datos, en el grupo Acciones de envío, haga clic en A otras ubicaciones y, a continuación, en Servicio web para usar el mismo servicio web para enviar datos.
Escriba la dirección del servicio web que contiene los métodos de ejemplo del servicio web y haga clic en Siguiente.
Para el método de envío, seleccione setXhtml como la operación y haga clic en Siguiente.
Haga clic en Modificar, expanda la carpeta dataFields, expanda la carpeta s0:getXhtmlResponse, expanda la carpeta getXhtmlResult, seleccione el elemento MyRichTextElement y, a continuación, haga clic en Siguiente.
Haga clic en Finalizar.
En el panel de tareas Campos, expanda la carpeta dataFields.
Expanda las carpetas s0:getXhtmlResponse y getXhtmlResult, y después arrastre el elemento MyRichTextElement al formulario. InfoPath reconocerá que el elemento MyRichTextElement es un elemento XHTML y usará un control de cuadro de texto enriquecido para enlazarse a él.
Guarde o publique el formulario.
Para probar el formulario, ábralo, escriba contenido de texto enriquecido como imágenes, tablas y texto con formato. Haga clic en Enviar en la cinta para almacenar el contenido de texto enriquecido en el archivo out.xml del servidor. Haga clic en Consulta en la ficha Ver y haga clic en el botón del formulario Ejecutar consulta. El control Cuadro de texto enriquecido debe mostrar el contenido XHTML del archivo out.xml. Si el campo de texto enriquecido contiene varias líneas, el servicio web sólo aceptará la primera línea e ignorará el resto.