2010-11-15 4 views
0

У меня есть xml-файл, который необходимо обновить. Пользователь хочет выбрать год и сумму. Каков наилучший способ?Обновить файл xml с ColdFusion

Благодаря

<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> 
+0

Пользователь должен обновить файл, но выберите год и количество - я запутался: | Не могли бы вы объяснить немного лучше? –

+0

Например, если пользователь хочет изменить сумму от 1000 до 2000 в теге 2010 года. – Noe

+1

XPath - язык запросов - он не может изменить XML-документ. Чтобы создать новый XML-документ из существующего, вам понадобится дополнительный инструмент. XSLT - это язык, который был разработан специально с целью преобразования одного документа XML в другой. Задайте этот вопрос в теге xslt, и вы получите удивительно простой, короткий и мощный ответ. :) –

ответ

2

Вы, вероятно, хотите использовать «» содержит оператор (Alejandro указывает на то, что это не строгое соответствие) матч в XPath. Чтобы выполнить XPath в Coldfusion, используйте xmlSearch function на объекте XML. Функция normalize-space() выравнивает ведущее и конечное пробелы (например, CR в узле 2010 года).

Поскольку XPath соответствует узлу year напрямую, мы используем '/ ..' для извлечения родительского узла узла года. Это если вы хотите работать на любом другом другом узле в год (например, если был также узел «количество» или что-то еще).

<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 или более 1 результат.

+0

Спасибо, функция содержит то, что мне нужно. – Noe

+1

Отлично! Не забудьте принять ответ, если он правильный. –

+0

@Edwars M Smith: 'contains()' функция не является строгим соответствием, как '/ root/SGA [. = '# TargetYear #')]' или '/ root/SGA [normalize-space() = '# targetYear # ')] ' – 2010-11-16 14:15:36

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