Identificación personalizada de JQGrid xmlreader

Necesito pasar una identificación personalizada a la estructura xmlreader para que JQGrid se alimente de una combinación de nodos en los datos xml para identificar las filas de manera única. Actualmente tengo esta versión funcionando.

var feedXmlReaderOptions = {
    root: "feed",
    row: "entry",
    repeatitems: false,
    id: "d|clmNum,d|seqNum"
};

que concatena los nodos xml clmNum y seqNum para crear un identificador único para la fila.

Por cierto, el d| se refiere a un espacio de nombres utilizado en el xml, así que ignórelo, no es relevante para esta pregunta. El problema aquí es que necesito un delimitador entre clmNum y seqNum para poder analizar la identificación más adelante, durante el

ajaxRowOptions: {
        beforeSend:...
}

event, para que pueda crear dinámicamente la URL en la que necesito publicar. La URL para publicar obviamente escucha la misma identificación que la fila de la cuadrícula, por lo que ve la conexión. Lo que probé, dado el estilo del selector CSS utilizado, fueron los pseudo elementos CSS, a través de los cuales uno puede insertar elementos personalizados, inexistentes, en el selector:

d|clmNum:after { content: "_" },d|seqNum
d|clmNum.after('_'),d|seqNum

pero no funciona... Los selectores de jQuery se quejan del {, y el jquery .after(), al igual que .before(), parece funcionar en línea como métodos, no como argumentos, después de que el selector ya devolvió un resultado.

Entonces, ¿alguien tiene una idea sobre cómo hacer esto? La alternativa de devolver la clave concatenada durante la creación del xml no funciona, el xml no está bajo mi control.

Gracias un montón. serban@nj, estados unidos

Agregado para aclaraciones: Mi XML se ve así:

<?xml version="1.0" encoding="utf-8" ?> 
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xml:base="http://localhost:8888/eClaimWS/olddispatch.svc/">
<title type="text">DispatchManualInfo</title> 
<id>http://localhost:8888/eClaimWS/olddispatch.svc/DispatchManualInfo</id> 
<updated>2012-05-21T18:13:44Z</updated> 
<link rel="self" title="DispatchManualInfo" href="DispatchManualInfo" /> 
<entry>
<id>http://localhost:8888/eClaimWS/olddispatch.svc/DispatchManualInfo(clmNum='00C1400J0025',seqNum=1)</id> 
<title type="text" /> 
<updated>2012-05-21T18:13:44Z</updated> 
<author>
<name /> 
</author>
<link rel="edit" title="DispatchManualInfo" href="DispatchManualInfo(clmNum='00C1400J0025',seqNum=1)" /> 
<category term="eClaimDispatchProdModel.DispatchManualInfo" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /> 
<content type="application/xml">
<m:properties>
<d:busPhone /> 
<d:damDesc>cat</d:damDesc> 
<d:vehColor /> 
<d:totLssInd /> 
<d:dispTransCtr m:type="Edm.Int32" m:null="true" /> 
<d:clmntCity /> 
<d:companyCd>01</d:companyCd> 
<d:insZip>07470</d:insZip> 
<d:adjZip>07701 565</d:adjZip> 
<d:vehLocSt>NJ</d:vehLocSt> 
<d:vehMake /> 
<d:lossTypeAbbr>WIND</d:lossTypeAbbr> 
<d:homePhone>201-301-5411</d:homePhone> 
<d:insLstNm>derti</d:insLstNm> 
<d:city>wayne</d:city> 
<d:adjLocalPhone>973-434-2482</d:adjLocalPhone> 
<d:vehVin>UNK99999999999999</d:vehVin> 
<d:adjName>Elaine Maniscalco</d:adjName> 
<d:lstChgUser>Vendor</d:lstChgUser> 
<d:seqNum m:type="Edm.Int32">1</d:seqNum> 
<d:clmNum>00C1400J0025</d:clmNum> 
</m:properties>
</content>
</entry>
......
</feed>

No puedo usar feed>entry>id para configurar el parámetro id de xmlreader, porque el nodo id es demasiado grande y causa todo tipo de problemas como ID de fila para la cuadrícula... Lo que necesito es una versión corta del nodo id, algo como 00C1400J0025_1. Dado que clmNum y seqNum también están presentes de forma independiente en el XML, quería usar xmlreader con

id: "d|clmNum:after { content: "_" },d|seqNum" 

y eso no funcionó. Con

id: "d|clmNum,d|seqNum"

el ID de fila se convierte en 00C1400J00251 y tengo dificultades para analizarlo, porque clmNum puede ser cualquier cosa, de cualquier longitud.

preguntado el 21 de mayo de 12 a las 11:05

Me temo que debe incluir un ejemplo de los datos XML que usa como entrada y la definición jqGrid (código JavaScript) que usa. Sin la información es muy difícil entender sus problemas. -

El XML se ve así: -

Debe hacer clic en el enlace "editar" debajo de su pregunta y agregar el texto con nueva información. Aquí se describe cómo formatear el código. -

Lo siento, el comentario no permitía suficientes caracteres... mensaje inicial editado arriba con información adicional... gracias Oleg por tomarte el tiempo de ver esto. -

1 Respuestas

Te recomendaria usar beforeProcessing devolución de llamada para normalizar el <id> valores de la <entry> elementos de

<id>http://localhost:8888/eClaimWS/olddispatch.svc/DispatchManualInfo(clmNum='00C1400J0025',seqNum=1)</id>

a

<id>00C1400J0025_1</id>

Para implementar esto puedes usar RegEx por ejemplo.

Después de eso, puede llenar fácilmente la cuadrícula con la información que necesita. Para leer información de elementos que tienen espacio de nombres u otros caracteres especiales, puede escapar del carácter con dos barras invertidas: \\ (consulte la sección del aquí información sobre el escape de metacaracteres). Por ejemplo, para leer el elemento d:adjName puedes usar xmlmap: 'd\\:adjName'. El enfoque funciona perfectamente en todos los navegadores con excepción de los navegadores webkit (Chrome, Safari). Como solución se puede utilizar xmlmap: 'd\\:adjName, adjName' porque xmlmap: 'adjName' funcionará en Chrome y Safari. Personalmente encuentro mejor el camino con el uso de getElementsByTagNameNS.

La demo parece:

enter image description here

y tiene el siguiente código

$("#list").jqGrid({
    url: "CustomXmlReader.xml",
    colModel: [
        {name: 'id'}, // optional
        {name: 'updated', formatter: 'date'},
        {name: 'adjName', xmlmap: function (entry) { // 'd\\:adjName, adjName'
                var nodes;
                if (entry.getElementsByTagNameNS) {
                    nodes = entry.getElementsByTagNameNS("http://schemas.microsoft.com/ado/2007/08/dataservices", "adjName");
                } else {
                    // old IE browsers
                    nodes = entry.getElementsByTagName("d:adjName");
                }
                return nodes.length > 0 ? nodes[0].firstChild.nodeValue : "";
            }}
    ],
    gridview: true,
    height: "auto",
    xmlReader: {
        root: "feed",
        row: "entry",
        repeatitems: false,
        id: "id"
    },
    beforeProcessing: function (data) {
        $(data).children("feed").children("entry").each(function () {
            var id = $(this).find(">id"),
                res = /\(clmNum='([0-9A-Z]+)',seqNum=(\d+)\)$/g.exec(id.text());
            id.text(res[1] + "_" + res[2]);
        });
    }
});

contestado el 21 de mayo de 12 a las 22:05

Como siempre, Oleg, ¡increíble tenerte entre nosotros! Su respuesta es más de lo que quería porque en realidad nos enseña cómo manipular los datos provenientes de fuentes de datos que no están bajo nuestro control. Muchas muchas gracias. - nenea

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.