2010-06-15 3 views
0

Я играл вокруг onError, поэтому я попытался создать ошибку, используя большой объект документа xml.structDelete не влияет на мелкую копию?

<cfset XMLByRef = variables.parsedXML.XMLRootElement.XMLChildElement> 
<cfset structDelete(variables.parsedXML, "XMLRootElement")> 
<cfset startXMLShortLoop = getTickCount()> 
<cfloop from = "1" to = "#arrayLen(variables.XMLByRef)#" index = "variables.i"> 
    <cfoutput>#variables.XMLByRef[variables.i].id.xmltext#</cfoutput><br /> 
</cfloop> 
<cfset stopXMLShortLoop = getTickCount()> 

Ожидалось получить сообщение об ошибке, поскольку я удалил структуру, на которую ссылался.

От LiveDocs:

Переменная Назначение - Создает дополнительные ссылки, или псевдоним, к структуре. Любое изменение данных с использованием одного имени переменной изменяет структуру , к которой вы обращаетесь, используя другое имя переменной . Этот метод полезен, если вы хотите добавить локальную переменную в другую область или иначе изменить область переменной без удаление переменной из оригинальной области.

вместо этого я получил

580df1de-3362-ca9b-b287-47795b6cdc17

25a00498-0f68-6f04-a981-56853c0844ed

... ... . ..

db49ed8a-0ba6-8644-124a-6d6ebda3aa52

57e57e28-e044-6119-afe2-aebffb549342

петельные 12805 раз в 297 миллисекунд

<cfdump var = "#variables#"> 

показывает, что нет ничего в структуре, просто parsedXML.xmlRoot.xmlName со значением XMLRootElement , Я также попытался

<cfset structDelete(variables.parsedXML.XMLRootElement, "XMLChildElement")> 

, а также structClear для обеих сторон.

Дополнительная информация об удалении из объекта документа xml. http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec22c24-78e3.html

Может кто-нибудь объяснить мою ошибочную логику? Благодарю.

+0

Если вы могли бы обеспечить более простой, работоспособный образец кода, который был бы большим. Кроме того, попробуйте один и тот же код с onError, только на обычной странице CFML, он все равно дает одинаковые результаты? –

+0

Ум, я могу попробовать, но он построен на реальных данных из XML-файла, за исключением того, что я изменил имена элементов для защиты данных. Это обычная страница CFML. onError находится в приложении.cfm и не запускается, как я ожидал бы этого @ Travis

ответ

2

XML-типы данных представляют собой комбинацию структур и массивов. В отличие от структур, массивы в CF передаются по значению, а не по ссылке и могут быть тем, что вы видите.

http://www.coldfusionjedi.com/index.cfm/2009/5/1/ColdFusion-and-Pass-by-Reference-versus-Value

+0

Этот вид имеет смысл, и это, вероятно, ответ , Кто-нибудь знает, почему я получаю эти результаты для «parsedXML.XMLRootElement.XMLChildElement?» isArray: NO isStruct: NO isObject: NO isQuery: NO isSimpleValue: NO isXML: YES isXMLDoc: NO isXMLElem: YES isXMLNode: YES isXMLRoot: NO structKeyExists: YES arrayLen: 12804. isArray и isStruct оба теперь, но structKeyExists - это yes и и arrayLen имеет значение и копирует его по значению как массив? – Travis

+0

oh, nevermind: В следующей таблице перечислены функции массива и структуры ColdFusion, которые можно использовать для управления объектами XML-документов и их функциями, а также описаны их общие применения. В некоторых случаях вы можете использовать либо функцию массива, либо функцию структуры для определенной цели, например, для удаления всех атрибутов элемента или дочерних элементов. – Travis

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