2012-05-10 1 views
0

Я ищу способ прокрутки XML-тела и передать каждый элемент xml в структуру. я получил доступ к телу XML следующим образом:получить все элементы тела xml и добавить в struct

<cfset var x = arguments.httpRequest /> 
<cfset cont = xmlparse(x) /> 
<cfset var body = xmlsearch(cont, "//SOAP-ENV:Body")[1] /> 
<cfset var args = body.xmlchildren[1].xmlchildren /> 
<cfset xmlElements = {} /> 
<cfset xmlElements["#args[1].xmlName#"] = "#args[1].xmlText#" /> 

так я могу получить каждый элемент аргументов, если это не ComplexType. Для доступа детей из сложных элементов я использовал этот способ:

<cfset var children = "" /> 
<cfset children = args[3].xmlchildren /> 
<cfset children = args[1].xmlchildren /> 

XML для третьего элемента выглядит следующим образом:

<Element> 
    <item> 
     <child1>XP_RA_10</child1> 
     <child2>RA-EXPRESS-KATALOG</Wmvtx>  
    </item> 
</Element> 

Но я хотел бы создать метод, который не проверить, если есть любых xmlchildren или нет. Я пытался сделать это таким образом ...

<cfif ArrayIsDefined(i.xmlchildren, 1)> 
    <cfset children = args[i].xmlchildren /> 
    <cfif ArrayIsDefined(children[1].xmlchildren, 1)> 
     <!--- if more xmlchildren exist ---> 
    <cfelse> 
     <!if one xmlchildren exist ---> 
    </cfif> 

<cfelse> 
    <!--- if xmlchidren doesn't exist ---> 
</cfif> 

... но я не получить доступ к элементам, чтобы вставить их в структуры, которые я создал бувигер. Всегда получая ошибку, что структура не определена ....

Это правильный способ проверить, есть ли какие-либо дочерние элементы?

+1

Я использовал [jsoup] (http://jsoup.org/) против XML раньше - это намного проще, чем XPath, и ходить через структуры и массивы - так что стоит подумать. –

+0

большое предложение peter ... Я просто не думал, что это даст ему результат (плоскую структуру), который он, казалось, искал. –

+0

похоже, что jsoup является ja javalibrary, но я программирую с помощью coldfusion и пытаюсь создать этот метод внутри компонента. –

ответ

0

, если вы не знаете структуру объекта XML раньше времени, вам придется протестировать каждый дочерний объект и пройти вниз по узлам, пока не узнаете, что у вас есть простой объект. Чтобы есть «есть» функция, как в:

isObject(var); 
isStruct(var); 
isArray(var); 
isSimpleValue(variable); 

После того, как вы знаете, у вас есть массив (например), вы проходной индекс это по длине, как в:

<Cfif isArray(children)> 
<cfloop form="1" to="#arraylen(children)#" index="i"> 
     <cfset thisNode = children[i]/> 
     <cfif isStruct(thisNode)? 
     .... do something with the structkeylist. 
     </cfif> 
    <Cfif isArray(thisNode)> 
     .... more looping... 
    </cfif> 
</cfloop> 
</cfif> 

Это может быть довольно сложный для действительно сложных объектов. Мне любопытно, почему вы это сделаете? XML разработан как «не плоский» - существует ли конкретное требование сгладить его?

+0

Я хочу добавить каждый простой элемент в struct, но befor, котор я могу сделать это должен пройти петлю до тех пор пока я не получу последний деталь в «древе». Xml не должен быть плоским, но если в дереве есть один сложный тип, было бы проще, если бы метод разрешил эту проблему для меня вместо того, чтобы программировать определенную, которая может быть использована только для одного файла. .. –

0

Это вы искали? XmlToStruct on RIAForge

+0

Я только начал создавать функцию, которая будет проходить через xml с разной глубиной. Но я не закончил его, потому что начал другой проект, и это было как упражнение для меня. Но этот проект выглядит так, как будто он может решить мою проблему. Я хотел получить результат всего внутри моего xml, разрешает ли этот проект эту проблему без сбоев, когда нет элементов-потомков? –

+0

Насколько я могу судить, он должен работать. Разумеется, вам придется проверить это самостоятельно. – Russ

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