2012-05-21 3 views
2

Мне нужно передать пользовательский идентификатор в структуру xmlreader для JQGrid для комбинирования узлов в XML-данных, чтобы однозначно идентифицировать строки. я в настоящее время быть_наст эта версия рабочегоJQGrid xmlreader custom id

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

, который сцепляет XML-узлы clmNum и SEQNUM построить уникальный идентификатор для строки.

Кстати, d | относится к пространству имен, используемому в xml, поэтому, пожалуйста, проигнорируйте его, это не относится к этому вопросу. Проблема здесь в том, что мне нужен разделитель между clmNum и SEQNUM, так что я могу разобрать идентификатор позже, во время мероприятия

ajaxRowOptions: { 
     beforeSend:... 
} 

, так что я могу построить динамически в URL, что мне нужно, чтобы отправлять сообщения , URL-адрес для сообщения, очевидно, прослушивается с тем же идентификатором, что и строка сетки, поэтому вы видите соединение. То, что я пытался, учитывая стиль CSS селектор используется, были элементы CSS псевдо, с помощью которых можно вставить пользовательские, несуществующие элементы, в селекторе:

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

, но это не работает ... JQuery селекторы жалуйтесь на {, и jquery .after(), как и .before(), похоже, работают inline как методы, а не аргументы, после того, как селектор вернул результат.

Итак, у кого есть представление о том, как это сделать? Альтернатива возврату конкатенированного ключа во время создания xml не работает, xml не находится под моим контролем.

Спасибо, кучка. Serban @ NJ, USA

Добавлена ​​пояснениями: Мой XML выглядит следующим образом:

<?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> 

Я не могу использовать корма> запись> идентификатор для настройки параметра XmlReader И.Д., поскольку идентификатор узла является слишком большим и вызывает всевозможные проблемы как rowid для сетки ... Мне нужна короткая версия узла id, что-то вроде 00C1400J0025_1. С clmNum и SEQNUM также присутствуют независимо друг от друга в XML, я хотел использовать XmlReader с

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

и это не сработало. С

id: "d|clmNum,d|seqNum" 

ROWID становится 00C1400J00251 и у меня трудное время разбора его, потому что clmNum может быть что угодно, любой длины.

+0

Я боюсь, что ваш должен включать пример данных XML, которые вы используете в качестве входных данных и jqGrid (код JavaScript), который вы используете. без информации очень сложно понять ваши проблемы. – Oleg

+0

XML выглядит так: – nenea

+0

Вы должны нажать ссылку «изменить» под своим вопросом и добавить текст с новой информацией. [Здесь] (http://meta.stackexchange.com/a/22189/147495) описано, как форматировать код. – Oleg

ответ

0

Я бы порекомендовал вам использовать beforeProcessing обратного вызова для нормализации <id> значения <entry> элементов из

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

в

<id>00C1400J0025_1</id> 

Для реализации этого можно использовать, например RegEx.

После этого вы можете легко заполнить сетку необходимой информацией.Чтобы прочитать информацию из элементов, имеющих пространство имен или некоторые другие специальные символы, вы можете избежать символа с двумя обратными косыми чертами: \\ (см. here информация об экранировании метасимволов). Например, чтобы прочитать элемент d:adjName, вы можете использовать xmlmap: 'd\\:adjName'. Подход работает отлично во всех браузерах с исключениями браузеров webkit (Chrome, Safari). В качестве обходного пути можно использовать xmlmap: 'd\\:adjName, adjName', потому что xmlmap: 'adjName' будет работать в Chrome и Safari. Я лично считаю, что лучше с использованием getElementsByTagNameNS.

The demo выглядит следующим образом:

enter image description here

и имеют следующий код

$("#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]); 
     }); 
    } 
}); 
+0

Как всегда, Олег, порадовал вас среди нас! Ваш ответ больше, чем я хотел, потому что он на самом деле учит нас тому, как массировать данные, поступающие из источников данных, которые не находятся под нашим контролем. Большое большое спасибо. – nenea

+0

@nenea: Добро пожаловать! Я рад, что смогу вам помочь. – Oleg