2

我需要将自定义 id 传递给 xmlreader 结构,以便 JQGrid 从 xml 数据中的节点组合中获取唯一标识行。我目前有这个版本工作

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

它连接 clmNum 和 seqNum xml 节点以构建行的唯一标识符。

顺便说一句,d| 指的是xml中使用的命名空间,所以请忽略它,它与这个问题无关。这里的问题是我需要 clmNum 和 seqNum 之间的分隔符,以便稍后在

ajaxRowOptions: {
        beforeSend:...
}

事件,以便我可以动态构建需要发布到的 URL。发布到的 URL 显然侦听与网格行相同的 id,因此您可以看到连接。考虑到所使用的 CSS 选择器样式,我尝试的是 CSS 伪元素,通过它可以将自定义的、不存在的元素插入到选择器中:

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

但它不起作用......jQuery 选择器抱怨 {,而 jquery .after() 就像 .before() 一样,似乎在选择器返回结果之后作为方法而不是参数内联工作。

那么,有人知道如何做到这一点吗?在创建 xml 期间返回连接键的替代方法不起作用,xml 不受我的控制。

谢谢一堆。serban@nj,美国

为澄清而添加:我的 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>

我不能使用 feed>entry>id 来配置 xmlreader id 参数,因为 id 节点太大并且作为网格的 rowid 会导致各种问题......我需要的是 id 节点的短版本,一些像 00C1400J0025_1。由于 clmNum 和 seqNum 在 XML 中也独立存在,我想将 xmlreader 与

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

那没有用。和

id: "d|clmNum,d|seqNum"

rowid 变为 00C1400J00251 并且我很难解析它,因为 clmNum 可以是任何长度的任何东西。

4

1 回答 1

0

我建议您使用beforeProcessing回调来规范化元素的<id><entry>

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

<id>00C1400J0025_1</id>

要实现这一点,您可以使用RegEx例如。

之后,您可以轻松地用您需要的信息填充网格。要从具有命名空间或其他一些特殊字符的元素中读取信息,您可以使用两个反斜杠转义该字符:(\\请参阅此处有关转义元字符的信息)。例如要读取元素d:adjName,您可以使用xmlmap: 'd\\:adjName'. 该方法在除 webkit 浏览器(Chrome、Safari)之外的所有浏览器中都能完美运行。作为一种可以使用的解决方法,xmlmap: 'd\\:adjName, adjName'因为它可以xmlmap: 'adjName'在 Chrome 和 Safari 中使用。我个人发现使用getElementsByTagNameNS.

演示看起来像:

在此处输入图像描述

并具有以下代码

$("#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]);
        });
    }
});
于 2012-05-21T21:18:31.800 回答