Marklogic 未看到json:transform-from-json和fn:tokenize的预期输出
我们有两个REST扩展。两者都希望从客户端获得CSV数据。我们通过json传递完全相同的数据。传入的消息是相同的,我们在服务器上对接收到的json消息执行Marklogic 未看到json:transform-from-json和fn:tokenize的预期输出,marklogic,Marklogic,我们有两个REST扩展。两者都希望从客户端获得CSV数据。我们通过json传递完全相同的数据。传入的消息是相同的,我们在服务器上对接收到的json消息执行xdmp:log($input),相同: 2014-08-28 12:06:13.443 Info: STRLF3: START VERTALER ++++++++++++++++++++++++++++++++++++ 2014-08-28 12:06:13.443 Info: STRLF3: {"ID":"","DingenID":"","
xdmp:log($input)
,相同:
2014-08-28 12:06:13.443 Info: STRLF3: START VERTALER ++++++++++++++++++++++++++++++++++++
2014-08-28 12:06:13.443 Info: STRLF3: {"ID":"","DingenID":"","VertaalType":"VAN6NAARWIJK","Name":"Vertaling-28-Aug-2014 12:08.txt","Text":"PC,Verkoopprijs\n1000AK,89.99\n1000EA,49.99\n1001GM,100\n1001LA,34.99\n1001MJ,24.99\n1011AC,19.98\n1011AC,20.99\n1011AC,9.98\n1011AC,30.98\n1011BT,999.01\n1011CD,30\n1011DJ,12\n1011DJ,100.98\n1011DJ,99.98\n1011DJ,24.99\n1011DK,18.98\n1011EG,28.98\n1011EK,93.97\n1011EK,50.99\n1011ET,51.49\n1011EZ,51.99\n1011GA,24.99\n1011GD,34.99\n1011GR,35.99\n1011GW,29.99\n1011GW,24.99\n1011HB,14.98\n1011HB,29.99\n1011HB,65.45\n1011HB,28.79\n1011HL,49.99\n1011JH,18.98\n1011JH,19.99\n1011JH,14.98\n1011JX,70\n1011KC,54.98\n1011KK,100\n1011KX,43.98\n1011LE,119\n1011LL,49.99\n1011LL,4.99\n1011LM,64.99\n1011LM,39.95\n1011LS,13.97\n1011LX,20\n1011LZ,29.99\n1011LZ,16.99\n1011MG,49.99\n1011MH,100\n1011MH,79.99\n1011MH,72\n1011MK,31.99\n1011ML,48.98\n1011ML,24.99\n1011ML,83.97\n1011MN,23.98\n1011MN,35.97\n1011MR,30.99\n1011NA,19.8\n1011NC,24.99\n1011NK,73.98\n1011NV,12\n1011NV,19.99\n1011NV,19.99\n1011NV,9.98\n1011NV,4.99\n1011NV,12\n1011PG,50\n1011PG,39.98\n1011PG,24.99\n1011PL,35\n1011PL,366.01\n1011RH,23.99\n1011SG,8.98\n1011SG,10\n1011SP,50.99\n1011SZ,73.98\n1011TB,59.99\n1011TB,49.99\n1011TE,253.01\n1011TE,23.88\n1011TE,9.08\n1011TL,28\n1011TL,9.98\n1011TR,14.99\n1011TR,14.98\n1011TR,13.98\n1011TZ,33.97\n1011VB,220\n1011VZ,38.97\n1011WD,13.97\n1012AC,66.97\n1012AE,15.98\n1012AL,43.98\n1012AL,50.99\n1012BA,19.99\n1012BE,59.99\n1012BJ,29.99\n1012BJ,33.99"}
来自API2调用的日志消息:
2014-08-28 12:07:42.264 Info: STRLF3: ++++++++++++++++++ START TRANSACTIONS ++++++++++++++++++++++++++++++++++++
2014-08-28 12:07:42.264 Info: STRLF3: {"ID":"","DingenID":"","ProjectID":268393,"Name":"Transactiedata-28-Aug-2014 12:08.txt","Text":"PC,Verkoopprijs\n1000AK,89.99\n1000EA,49.99\n1001GM,100\n1001LA,34.99\n1001MJ,24.99\n1011AC,19.98\n1011AC,20.99\n1011AC,9.98\n1011AC,30.98\n1011BT,999.01\n1011CD,30\n1011DJ,12\n1011DJ,100.98\n1011DJ,99.98\n1011DJ,24.99\n1011DK,18.98\n1011EG,28.98\n1011EK,93.97\n1011EK,50.99\n1011ET,51.49\n1011EZ,51.99\n1011GA,24.99\n1011GD,34.99\n1011GR,35.99\n1011GW,29.99\n1011GW,24.99\n1011HB,14.98\n1011HB,29.99\n1011HB,65.45\n1011HB,28.79\n1011HL,49.99\n1011JH,18.98\n1011JH,19.99\n1011JH,14.98\n1011JX,70\n1011KC,54.98\n1011KK,100\n1011KX,43.98\n1011LE,119\n1011LL,49.99\n1011LL,4.99\n1011LM,64.99\n1011LM,39.95\n1011LS,13.97\n1011LX,20\n1011LZ,29.99\n1011LZ,16.99\n1011MG,49.99\n1011MH,100\n1011MH,79.99\n1011MH,72\n1011MK,31.99\n1011ML,48.98\n1011ML,24.99\n1011ML,83.97\n1011MN,23.98\n1011MN,35.97\n1011MR,30.99\n1011NA,19.8\n1011NC,24.99\n1011NK,73.98\n1011NV,12\n1011NV,19.99\n1011NV,19.99\n1011NV,9.98\n1011NV,4.99\n1011NV,12\n1011PG,50\n1011PG,39.98\n1011PG,24.99\n1011PL,35\n1011PL,366.01\n1011RH,23.99\n1011SG,8.98\n1011SG,10\n1011SP,50.99\n1011SZ,73.98\n1011TB,59.99\n1011TB,49.99\n1011TE,253.01\n1011TE,23.88\n1011TE,9.08\n1011TL,28\n1011TL,9.98\n1011TR,14.99\n1011TR,14.98\n1011TR,13.98\n1011TZ,33.97\n1011VB,220\n1011VZ,38.97\n1011WD,13.97\n1012AC,66.97\n1012AE,15.98\n1012AL,43.98\n1012AL,50.99\n1012BA,19.99\n1012BE,59.99\n1012BJ,29.99\n1012BJ,33.99"}
然后我们进入代码的这一部分:
在API 1中,我们有:
let $_ := xdmp:log("START VERTALER ++++++++++++++++++++++++++++++++++++")
let $_ := xdmp:log($input)
let $id := sl3:get-id("/app/vertaler/", "json")
let $uri := fn:concat("/app/vertaler/", $id, ".xml")
let $xml := json:transform-from-json($input)
let $vertaaltype:= $xml//jbasic:VertaalType/text()
let $fileID := $xml//jbasic:ID/text()
let $preurl := 'http://streetlife.dikw.com'
(: do vertaal magic here ... :)
let $text := $xml//jbasic:Text/text()
let $_ := xdmp:log(fn:concat("Recieved text data, raw: ", $input))
let $codes := fn:tokenize($text,'\n')
(: check if tokenization is ok :)
let $_ := xdmp:log(fn:concat("Recieved text data, count: ", fn:count($codes)))
结果1:
2014-08-28 12:06:13.445 Info: STRLF3: Recieved text data, count: 100
我们看到文件被正确解析
在API 2中,我们有:
let $project := json:transform-from-json($input)/ns:ProjectID
let $codes := json:transform-from-json($input)/ns:Text
let $_ := xdmp:log(fn:concat("123 Recieved text data, raw: ", $input))
let $text := fn:tokenize($codes,' ') (: of '/n' :)
let $_ := xdmp:log(fn:concat("Recieved text data, count: ", fn:count($text)))
使用\n
作为标记化字符的结果API 2:
2014-08-28 12:07:42.266 Info: STRLF3: Recieved text data, count: 1
API1需要fn:tokenize($text,'\n'),API2需要fn:tokenize($code,'
;')。额外的空间是有意的
json:transformfromjson
的预期结果是什么?API 1或2的行为,或者换句话说,我是否需要用\n
或
标记代码>?正如您所看到的,我在tokenize函数中有两个API,每个API都在工作,但不与另一个值一起工作
让我困惑的是,我已经逐行检查了,包括加载名称空间和模块,但仍然找不到区别。如果在调用json:transform-from-json()时不提供配置,结果是“”名称空间中的XML
第一个示例将jsbasic前缀绑定到该名称空间,并使用子体XPath(“/”)提取属性
假设第二个示例将ns前缀绑定到…/json/basic名称空间,XPath将尝试匹配根位置的属性。无配置转换为json生成的XML中的根始终是“json”(带有名称空间),因此XPath不匹配。根据JSON的结构,可以使用子体XPath(“/”),如第一个示例所示
在第二个示例中,为了提高效率,您可能还希望在变量中捕获json:transform-from-json()的输出,如:
let $xml := json:transform-from-json($input)
let $project := $xml//ns:ProjectID
let $codes := $xml//ns:Text
如果这不起作用,请尝试记录$xml以检查转换的输出
以下是文档:
我怀疑这是换行转义的问题
xdmp:to-json(
'line 1
line 2')
=> "line 1\nline 2"
现在尝试添加tokenize
:
xdmp:to-json(
'line 1
line 2')
! tokenize(., '\n')
=> "line 1\nline 2"
这没有任何作用,因为tokenize
将其第二个参数视为正则表达式。因此正则表达式\n
匹配一个文字换行符,而输入中的换行符实际上是两个字符\
和n
xdmp:to-json(
'line 1
line 2')
! tokenize(., '\\n')
=> "line 1
line 2"
这更接近我们想要的。我可能也不想在输出中使用双引号字符。但这只是为了说明换行符转义可能是个什么问题。我仍然不太明白问题是什么,但这对我来说适用于7.0-3:
let $input := '{"ID":"","DingenID":"","ProjectID":268393,"Name":"Transactiedata-28-Aug-2014 12:08.txt","Text":"PC,Verkoopprijs\n1000AK,89.99\n1000EA,49.99\n1001GM,100\n1001LA,34.99\n1001MJ,24.99\n1011AC,19.98\n1011AC,20.99\n1011AC,9.98\n1011AC,30.98\n1011BT,999.01\n1011CD,30\n1011DJ,12\n1011DJ,100.98\n1011DJ,99.98\n1011DJ,24.99\n1011DK,18.98\n1011EG,28.98\n1011EK,93.97\n1011EK,50.99\n1011ET,51.49\n1011EZ,51.99\n1011GA,24.99\n1011GD,34.99\n1011GR,35.99\n1011GW,29.99\n1011GW,24.99\n1011HB,14.98\n1011HB,29.99\n1011HB,65.45\n1011HB,28.79\n1011HL,49.99\n1011JH,18.98\n1011JH,19.99\n1011JH,14.98\n1011JX,70\n1011KC,54.98\n1011KK,100\n1011KX,43.98\n1011LE,119\n1011LL,49.99\n1011LL,4.99\n1011LM,64.99\n1011LM,39.95\n1011LS,13.97\n1011LX,20\n1011LZ,29.99\n1011LZ,16.99\n1011MG,49.99\n1011MH,100\n1011MH,79.99\n1011MH,72\n1011MK,31.99\n1011ML,48.98\n1011ML,24.99\n1011ML,83.97\n1011MN,23.98\n1011MN,35.97\n1011MR,30.99\n1011NA,19.8\n1011NC,24.99\n1011NK,73.98\n1011NV,12\n1011NV,19.99\n1011NV,19.99\n1011NV,9.98\n1011NV,4.99\n1011NV,12\n1011PG,50\n1011PG,39.98\n1011PG,24.99\n1011PL,35\n1011PL,366.01\n1011RH,23.99\n1011SG,8.98\n1011SG,10\n1011SP,50.99\n1011SZ,73.98\n1011TB,59.99\n1011TB,49.99\n1011TE,253.01\n1011TE,23.88\n1011TE,9.08\n1011TL,28\n1011TL,9.98\n1011TR,14.99\n1011TR,14.98\n1011TR,13.98\n1011TZ,33.97\n1011VB,220\n1011VZ,38.97\n1011WD,13.97\n1012AC,66.97\n1012AE,15.98\n1012AL,43.98\n1012AL,50.99\n1012BA,19.99\n1012BE,59.99\n1012BJ,29.99\n1012BJ,33.99"}'
let $m := xdmp:from-json($input)
let $text as xs:string := map:get($m, 'Text')
let $records := tokenize($text, '\n')
let $labels := tokenize($records[1], ',')
let $data := subsequence($records, 2)
for $i in $data
let $seq := tokenize($i, ',')
return text { $labels[1], $seq[1], $labels[2], $seq[2] }
我使用xdmp:fromjson
来解析json,而不是json:transformfromjson
。我不确定这是否与换行处理有什么不同,但它会返回一个json dictionary对象。这类似于map:map项,只是键是有序的
无论如何,它返回:
PC 1000AK Verkoopprijs 89.99
PC 1000EA Verkoopprijs 49.99
PC 1001GM Verkoopprijs 100
PC 1001LA Verkoopprijs 34.99
...
您还可以使用json:transformfromjson
来实现这一点。将$m
和$text
的赋值替换为:
let $text as xs:string := json:transform-from-json($input)/xjb:Text
在和#10上标记代码>对我来说同样适用于任何一个代码示例。谢谢您的回复,但示例显示我们发现文本没有问题。问题是当我们标记第一个需要/n第二个需要代码点(10)来标记。。。不知道为什么?添加“receivedtextdata,raw”日志消息,这样我们就可以看到需要标记化的文本。在上面的第一个和第二个代码块中,最后一行相当长…但仍然没有说明在一个api中的方式fn:tokenize($text,'\n')工作,而在另一个api中不。。。在这里,我需要fn:tokenize($code,
;'),以便标记器拆分>>相同的换行符表示形式,在默认设置中,json:transform-from-json()应该是什么?因此,这意味着换行符也被转换为HTML表示形式,即代码点(10)…请参见:json:transformfromJSON(“[”\n“])/*[1]!字符串到代码点(.)