說,我有一個文檔 -如何遍歷內存中的XML結構並替換子項?
<something>
<parent>
<child>Bird is the word 1.</child>
<child>Curd is the word 2.</child>
<child>Nerd is the word 3.</child>
</parent>
<parent>
<child>Bird is the word 4.</child>
<child>Word is the word 5.</child>
<child>Bird is the word 6.</child>
</parent>
</something>
我想通過文件來遍歷並與「狗」用XQuery和MarkLogic API的替換單詞「鳥」。到目前爲止,我能夠實現與下面的代碼 -
let $doc := $DOC
return <something>
{for $d at $y in $doc/element()
let $p := <parent>
{for $c in $d/element()
let $child := if(fn:matches($c, "Bird")) then(<child>{fn:replace($c, "Bird", "Dog")}</child>) else($c)
return $child
}</parent>
return $p}
</something>
結果
<something>
<parent>
<child>Dog is the word 1.</child>
<child>Curd is the word 2.</child>
<child>Nerd is the word 3.</child>
</parent>
<parent>
<child>Dog is the word 4.</child>
<child>Word is the word 5.</child>
<child>Dog is the word 6.</child>
</parent>
</something>
我怎樣才能做到這一點沒有嵌套的for循環?之前曾詢問過這個問題,但是使用了XSLT。
爲什麼不使用像** s/Bird/Dog/g **這樣的正則表達式?它會在一次線性時間內完成。 – Wontonimo
@wontonimo雖然可以對序列化的XML進行字符串操作,但它被認爲是不好的做法。確保您只在實際需要的地方應用更改也更加困難。使用單遍字符串替換時,很難確保只更改'child'元素的內容,而不更改其他元素或屬性的內容。更重要的是,不會有任何混淆XML格式良好的風險,無意中重命名XML標籤,或者更糟糕的是,導致它們被破壞或刪除。 – grtjn
@grtjn - 同意,雖然你可以添加xml標籤檢查到正則表達式像這樣** s /(\> [^ \ <] *)Bird([^ \ <] * \ <)/ $ 1Dog $ 2/g **,如果您檢查將**孩子**更改爲**父**,則會看到它不會修改標籤內部,而只會修改標籤之間的單詞** **。 – Wontonimo