2012-05-21 2 views
2

xmlreader 구조체에 사용자 지정 ID를 전달하여 JQGrid가 xml 데이터의 노드 조합을 공급하여 행을 고유하게 식별하도록해야합니다. 나는 현재 행에 대한 고유 식별자를 구축하기 위해 clmNum 및을 임의로 XML 노드를 연결합니다JQGrid xmlreader 사용자 지정 id

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

작업이 버전이있다.

그런데 d | xml에 사용 된 네임 스페이스를 참조하므로 무시하십시오.이 질문과 관련이 없습니다. 여기 문제는 내가

ajaxRowOptions: { 
     beforeSend:... 
} 

이벤트 기간 동안, 나중에 ID를 구문 분석 할 수 있도록 내가 동적으로 내가 게시하는 데 필요한 URL을 구축 할 수 있도록 내가는 clmNum 및 SEQNUM 사이의 구분이 필요하다는 것입니다 . 게시 할 URL은 그리드 행과 동일한 ID를 수신하므로 연결이 표시됩니다. 내가 사용하는 CSS 선택기 스타일 주어 시도했다 하나는 선택으로, 사용자 정의, 존재하지 않는 요소를 삽입 할 수있는을 통해 CSS 의사 요소, 무엇 :

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

을하지만 ... jQuery를 선택기 작동하지 않습니다 {}에 대해 불평하고, .before()처럼 jquery .after()는 셀렉터가 이미 결과를 반환 한 후에 인수가 아닌 메소드로 인라인으로 작동하는 것처럼 보입니다.

그래서 누구나 어떻게 할 수 있습니까? xml을 만드는 동안 연결 키를 반환하는 대신 xml이 내 제어하에 있지 않습니다.

감사합니다. SERBAN @ 뉴저지, 미국 해명에 대한

추가 : 내 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 id 매개 변수를 구성하기위한 공급> 항목> ID를 사용할 수 없습니다 그리드에 대한 ROWID로 모든 종류의 문제가 발생합니다. 필요한 것은 00C1400J0025_1과 같은 ID 노드의 짧은 버전입니다. clmNum 및을 임의로 또한 XML에서 독립적으로 제시되기 때문에 , 나는

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

와의 XMLReader를 사용하고 싶었 그것은 작동하지 않았다.

id: "d|clmNum,d|seqNum" 

ROWID를이 00C1400J00251가되고 clmNum 아무것도 할 수 있기 때문에 내가 어떤 길이, 파싱 힘든 시간을 함께 .

+0

내가 당신의 당신이 입력하고있는 jqGrid로 사용하는 XML 데이터의 예를 포함 할 필요가 두렵다 다음 코드가 정의 (JavaScript 코드)를 사용합니다. 정보가 없으면 문제를 이해하기가 매우 어렵습니다. – Oleg

+0

XML은 다음과 같습니다 : – nenea

+0

질문 아래에있는 "편집"링크를 클릭하고 새 정보로 텍스트를 추가해야합니다. [Here] (http://meta.stackexchange.com/a/22189/147495)에는 코드 서식을 지정하는 방법이 설명되어 있습니다. – Oleg

답변

0

난 당신이 예를 들어 RegEx을 사용할 수 있습니다이를 구현하기 위해

<id>00C1400J0025_1</id> 

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

에서 <entry> 요소의 <id> 값을 정상화 beforeProcessing 콜백을 사용하는 것이 좋습니다 것입니다.

그 후에 필요한 정보로 그리드를 쉽게 채울 수 있습니다.네임 스페이스 또는 다른 특수 문자가있는 요소에서 정보를 읽으려면 두 개의 백 슬래시 (\\)를 사용하여 문자를 이스케이프 처리 할 수 ​​있습니다 (메타 문자 이스케이프에 대한 정보는 here 참조). 예를 들어 d:adjName 요소를 읽으려면 xmlmap: 'd\\:adjName'을 사용할 수 있습니다. 이 접근법은 예외적 인 웹킷 브라우저 (Chrome, Safari)가있는 모든 브라우저에서 완벽하게 작동합니다. 이 문제를 해결하려면 xmlmap: 'adjName'이 Chrome 및 Safari에서 작동하므로 xmlmap: 'd\\:adjName, adjName'을 사용할 수 있습니다. 나는 개인적으로 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

언제나 그렇듯이, 올렉 (Oleg), 우리 중에 너를 두려워해라! 귀하의 답변은 내가 원하는 것 이상입니다. 실제로 우리가 통제 할 수없는 데이터 소스에서 오는 데이터를 마사지하는 법을 가르쳐주기 때문입니다. 많은, 많은 감사합니다. – nenea

+0

@nenea : 천만에요! 내가 너를 도울 수있어서 기뻐. – Oleg