2012-12-20 71 views
3

XQuery中是否支持數組?舉例來說,如果我們想在XQuery來實現 簡單的java程序如何,我們將做到這一點:如何在XQuery中使用或實現數組?

(我不要求將整個程序翻譯成XQuery的,但只是要求 如何實現行號數組下面的2個代碼到xquery中?我是 也是使用marklogic/xdmp函數)。

java.lang.String test = new String("Hello XQuery"); 
char[] characters = test.toCharArray(); 

for(int i = 0; i<characters.length; i++) { 
    if(character[i] == (char)13) { 
     character[i] = (char) 0x00; 
    } 
} 

Legend: 

hex 0x00 dec 0 : null 
hex 0x0d dec 13: carriage return 
hex 0x0a dec 10: line feed 
hex 0x20 dec 22: dquote 

回答

6

與樣品代碼轉換爲XQuery的問題不是缺乏對陣列的支持,但事實證明,X00XML一個有效的字符。如果不是因爲這個問題,你可以用簡單的函數調用快遞查詢:

translate($input, '&#x13;', '&#x00;') 

現在,你可能會說,欺騙,進而它只是碰巧讓有這不正是你想要的功能手工操作。但是如果這個函數不存在,你可以在XQuery中對它進行編程:有足夠的字符串可用於字符串,以允許您以任何您想要的方式操縱它們。如果需要(並且很少需要),可以使用函數string-to-codepoints()將字符串轉換爲整數序列,然後利用所有的XQuery工具來操作序列。

的教訓是,當你使用說明性語言像XQueryXSLT,不要試圖用你被迫在使用更原始語言相同低級別的編程技術。通常有更直接的方式來表達問題。

+0

最初的問題是從xml中的節點中提取textcontent並將其轉換爲ms-excel可理解的csv(逗號分隔值)格式,通過轉義某些特殊字符(如dquote(「),comma(, ),換行符(\ n)或換行符(\ r),我需要使用xquery來完成它的幫助,如果xml文件大小達到GB,它會是一個重載嗎?一個更好的方法來解決這個問題?感謝您的寶貴幫助 –

+1

最好首先提出您想要回答的問題對於多GB XML,您可能需要使用流式解析器或面向事件的解析器,所以內存利用率保持不變 – mblakele

+1

某些XQuery處理器對流式處理有一些支持,在評論中作爲補充提出這個問題太大了。 –

0

有兩種方法可以做到這一點。

  • 首先你可以創建一個XmlResults使用 XmlManager.createResults()對象,並使用XmlResults.add()到您的 字符串添加到這一點。然後可以使用XmlResults對象在XmlQueryContext中設置變量的 值,該變量可用於您的 查詢。

    實施例:

    XmlResults values = XMLManager.createResults(); 
    values.add(new XmlValue("value1")); 
    values.add(new XmlValue("value2")); 
    XmlQueryContext.setVariableValue("files", values); 
    
  • 另一種方法是在分開的XQuery的字符串。您可以使用tokenize()函數執行此操作,該函數使用 正則表達式與字符串分隔符匹配。

    http://www.w3.org/TR/xpath-functions/#func-tokenize

感謝。

3

XQuery內置了對序列的支持。函數tokenize()(如@ harish.ray所示)返回一個序列。你也可以用大括號和逗號自己構造一個:

let $mysequence = (1, 2, 3, 4) 

序列是有序列表,所以你可以依賴它。這與從XPath返回的節點集稍有不同,那些通常是文檔訂購的

在側面標記上:實際上,XQuery中的所有內容都是節點集序列。即使函數被聲明爲返回一個字符串或int,也可以將該返回值視爲一個項目的序列。無需顯式轉換,因爲無論如何,XQuery中都沒有構造。像fn:exists()fn:empty()這樣的功能總能正常工作。

HTH!

2

只是爲了好玩,這裏是我如何在XQuery中執行此操作,如果fn:translate不存在。我認爲邁克爾凱的建議最終會看起來類似。

let $test := "Hello XQuery" 
return codepoints-to-string(
    for $c in string-to-codepoints($test) 
    return if ($c eq 32) then 44 else $c) 

請注意,由於他指出的問題,我改變了轉換:0不是合法的代碼點。所以我把空格翻譯成了逗號。

使用MarkLogic,另一種選擇是使用http://docs.marklogic.com/json:array及其相關功能。功能將允許以模糊的命令式編碼。編碼這兩種變化可能是一個很好的學習練習。

0

您可以構建一個這樣的數組:

$myArray = tokenize('a b c d e f g', '\s') 
// $myArray[3] -> c 

請注意,這個僞數組的第一個指數是1不是0!