更新する必要のあるxmlファイルがあります。ユーザーは、年と金額を選択できるようにしたいと考えています。最善の方法は何ですか?
ありがとう
<root>
<SGA>
<Year>2008</Year>
<Amt>940</Amt>
</SGA>
<SGA>
<Year>2009</Year>
<Amt>980</Amt>
</SGA>
<SGA>
<Year>2010</Year>
<Amt>1000</Amt>
</SGA>
</root>
更新する必要のあるxmlファイルがあります。ユーザーは、年と金額を選択できるようにしたいと考えています。最善の方法は何ですか?
ありがとう
<root>
<SGA>
<Year>2008</Year>
<Amt>940</Amt>
</SGA>
<SGA>
<Year>2009</Year>
<Amt>980</Amt>
</SGA>
<SGA>
<Year>2010</Year>
<Amt>1000</Amt>
</SGA>
</root>
XPathで「contains」演算子(Alejandroはこれは厳密な一致ではないことを指摘しています)を使用することをお勧めします。ColdfusionでXPathを実行するには、XMLオブジェクトでxmlSearch関数を使用します。normalize-space()関数は、先頭と末尾の空白を削除します(たとえば、2010年ノードのCRを修正します)。
XPathは年ノードと直接一致しているため、「/..」を使用して年ノードの親をフェッチします。これは、他の兄弟ノードのいずれかを1年ごとに操作したい場合です(たとえば、「数量」ノードなどもあった場合)。
<cfxml variable="foo">
<root>
<SGA>
<Year>2008</Year>
<Amt>940</Amt>
</SGA>
<SGA>
<Year>2009</Year>
<Amt>980</Amt>
</SGA>
<SGA>
<Year>2010
</Year>
<Amt>1000</Amt>
</SGA>
</root>
</cfxml>
<cfset targetYear=" 2010">
<cfset newAmount=2000>
<cfdump var="#foo#">
<!--- returns an array of matching nodes. --->
<cfset bar = xmlSearch(foo,"/root/SGA/Year[normalize-space()='#trim(targetYear)#']/..")>
<cfdump var="#bar#">
<cfset bar[1].Amt.xmlText = newAmount>
<cfdump var="#foo#">
実際のアプリケーションでは、xmlSearch(この場合はバー)の結果を配列として反復処理する必要があります。これは、0個以上の結果を取得する可能性があるためです。