2017-06-22 101 views
1

使用TCL,我想設置一個正則表達式來獲取我的XML字符串中的數據。我提供的代碼有一個我正在處理的示例字符串,正則表達式試圖找到第一個右括號並保留數據,直到下一個打開的括號將其放入可變數字中。不幸的是我得到的輸出是:「< RouteLabel> Hurdman <」而不是預期的「Hurdman」。任何幫助真的會被讚賞。TCL正則表達式傳入變量

set direction(1) {<RouteLabel>Hurdman</RouteLabel>} 
regexp {^.*>(.*)<} $direction(1) number 
+0

它看起來就像你正在試圖[解析與正則表達式XML(https://stackoverflow.com/a/1732454/301832)。不要這樣做。使用tDOM包。 –

+0

我只用這個正則表達式解析XML數據的衆所周知的單個字符串,簡單地實現一個正則表達式來解析出這個實例中的數據要快得多。這就是說,你有什麼好的tDOM包學習材料的建議嗎? –

回答

1

這裏的問題不是正則表達式,而是你如何使用它。

你需要的語法是

regexp <PATTERN> <INPUT> <WHOLE_MATCH_VAR> <CAPTURE_1_VAR> ... <CAPTURE_n_VAR> 

所以,你的情況,你有沒有興趣在全場比賽,只是把_在整場比賽預計:

set direction(1) {<RouteLabel>Hurdman</RouteLabel>} 
regexp {^.*>(.*)<} $direction(1) _ number 
puts $number 

印刷Hurdman。請參閱online Tcl demo

1

速成班TDOM這個確切的任務:

獲取TDOM(注意包的名字拼寫不同):

% package require tdom 
0.8.3 

創建一個空的文件有根元素叫foobar

% set doc [dom createDocument foobar] 
domDoc02569130 

修復根目錄:

% set root [$doc documentElement] 
domNode025692E0 

設置你的XML字符串之一:

% set direction(1) {<RouteLabel>Hurdman</RouteLabel>} 
<RouteLabel>Hurdman</RouteLabel> 

將它添加到DOM樹的根:

% $root appendXML $direction(1) 
domNode025692E0 

得到你想要的XPath表達式的字符串:

% $root selectNodes {string(//RouteLabel/text())} 
Hurdman 

或者通過查詢根目錄(只有在一次只插入一個文本節點的情況下才有效,否則將它們全部並置):

% $root asText 
Hurdman 

如果想從根本上清除DOM樹,以使其準備追加新的字符串不舊的干擾:

% foreach node [$root childNodes] {$node delete} 

但是如果你使用XPath表達式,你應該能夠附加任意數量的XML字符串並仍然檢索其內容。

再次:

package require tdom 
set doc [dom createDocument foobar] 
set root [$doc documentElement] 
set direction(1) {<RouteLabel>Hurdman</RouteLabel>} 
$root appendXML $direction(1) 
$root selectNodes {string(//RouteLabel/text())} 
# => Hurdman 

文檔: tdom (package)

+0

謝謝!很有幫助! –