2016-03-05 2 views
0

РассмотримКак проверить, было ли добавлено определенное значение в ряду значений в XML prop?

set data {<prop>red;blue;green</prop>} 

Я могу добавить новый цвет с помощью

incr count [regsub -all -- \ 
     [appendArgs (< $name >)(.*?)(</ $name >)] $data [appendArgs \ 
     \\1 $newValue \\3] data] 

где новое_значение определяется

set newValue [join \ 
    [list \\2 [string map [list \\ \\\\] $value]] $separator] 

, если значение "розовый", я в конечном итоге с

<prop>red;blue;green;pink</prop> 

Если я запустить его снова, я получаю

<prop>red;blue;green;pink;pink</prop> 

Можно ли переписать регулярное выражение для проверки $ значения, и только добавить его, если он отсутствует? Кроме того, он должен уметь обрабатывать

<prop>red;blue;pink;green</prop> 

Я попробовал ((?! $ Value)), но на самом деле это не сработало. Любая помощь очень ценится.

ответ

0
proc addToContent {data color} { 
    lassign [split $data <>] -> tag content endtag 
    if {$color ni [split $content \;]} { 
     return "<$tag>$content;$color<$endtag>" 
    } else { 
     return $data 
    } 
} 

addToContent {<prop>red;blue;green</prop>} pink 
# -> <prop>red;blue;green;pink</prop> 
addToContent {<prop>red;blue;pink;green</prop>} pink 
# -> <prop>red;blue;pink;green</prop> 

Если ваша версия Tcl не lassign, используйте foreach {-> tag content endtag} [split $data <>] break. Если у вас нет оператора ni, используйте [lsearch -exact [split $content \;] $color] < 0. В обоих случаях вы должны обновить.

Но для реальной обработки XML вы должны использовать что-то вроде tDOM.

Документация: if, lassign, proc, return, split, tDOM

Смежные вопросы