Я использую ColdFusion 8.
Я анализирую XML-документ и мне нужно получить одно значение, которое скрыто глубоко в документе. Я успешно анализирую документ и получаю нужные мне значения, но, похоже, должен быть более эффективный способ получить те же данные.
Я НЕ много разбирал XML. Является ли необходимость проверять наличие ключей настолько глубоким для анализа XML или я делаю что-то не так? Есть ли лучший способ кодировать это?
// PARSE THE SOAP RESPONSE
SoapResponse = xmlParse(httpResponse.fileContent);
// PUT THE RESPONSE NODES INTO AN ARRAY
ResponseNodes = xmlSearch(SoapResponse, "//*[ local-name() = 'OnlineBoothInformation' ]");
// LOOP THROUGH THE ARRAY AND GET EACH NODE
for (i = 1; i lte arrayLen(ResponseNodes); i++) {
// CREATE NEW STRUCTURE TO HOLD BOOTH DATA
BoothInfo = structNew();
// TEST FOR CUSTOM FIELDS TO FIND NEW EXHIBITOR
BoothInfo.NewExhibitor = 0; // DEFAULT NEW EXHIBITOR
if (structKeyExists(ResponseNodes[i], "CustomFields")) {
CustomFields = xmlParse(ResponseNodes[i].CustomFields);
for (j = 1; j lte arrayLen(CustomFields); j=j+1) {
if (structKeyExists(ResponseNodes[i].CustomFields[j], "Field")) {
Field = xmlParse(ResponseNodes[i].CustomFields[j].Field);
for (k = 1; k lte arrayLen(Field); k=k+1) {
if (ResponseNodes[i].CustomFields[j].Field[k].XmlAttributes.Name == "New Exhibitor") {
BoothInfo.NewExhibitor = 1;
}
}
}
}
}
}
Я получаю другие значения для структуры BoothInfo. Они были НАМНОГО легче получить. Я не включил их в этот пример.
UPDATE
Мне удалось переписать код и получить то, что мне нужно, гораздо эффективнее.
// NEW EXHIBITOR
BoothInfo.NewExhibitor = 0;
if (structKeyExists(ResponseNodes[i].CustomFields, "Field")) {
Fields = ResponseNodes[i].CustomFields.Field;
for (j = 1; j lte arrayLen(Fields); j++) {
if (Fields[j].XmlAttributes.Name == "New Exhibitor") {
BoothInfo.NewExhibitor = 1;
break;
}
}
}