2017-06-22 10 views
1

TCLを使って作業していて、xml文字列内のデータを取得するための正規表現を設定しようとしています。私が提供したコードは、私が扱っているものの例の文字列を持っており、regexpは最初の閉じ括弧を見つけようとしていて、次の開いた括弧までデータを保持し、それを変数番号に置きます。残念ながら、私が得ている出力は、 "< 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 

印刷Hurdmanonline Tcl demoを参照してください。

取得TDOM(パッケージ名で別のスペルに注意してください):この正確なタスクのTDOMで

1

クラッシュコース

% package require tdom 
0.8.3 

foobarと呼ばれるルート要素と空のドキュメントを作成します。

% set doc [dom createDocument foobar] 
domDoc02569130 

ルートの修正を入手してください:

% set root [$doc documentElement] 
domNode025692E0 

セットアップあなたのXML文字列の1:

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

がルートにDOMツリーに追加します:

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

% $root appendXML $direction(1) 
domNode025692E0 

を使用すると、XPath式でたい文字列を取得します。または、ルートを照会することによって(一度に1つのテキストノードしか挿入されていない場合にのみ動作します。そうでない場合は、すべて連結されます)

% $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

ありがとうございます!非常に役立ちます! –