Как эффективно протестировать и проанализировать глубокое значение в XML? - PullRequest
1 голос
/ 15 марта 2012

Я использую 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;
        }
}
}

1 Ответ

2 голосов
/ 15 марта 2012

Ну, я не понимаю, почему вы снова и снова вызываете xmlParse. Это используется для преобразования строки в набор узлов XML, но у вас уже есть набор узлов XML.

Вы можете использовать более конкретную спецификацию XPath для нужных вам узлов. Может быть, что-то вроде //*[ local-name() = 'OnlineBoothInformation' ]/CustomFields/Field[@Name="New Exhibitor"]. Затем вы можете просто проверить, был ли возвращен пустой массив. XPath действительно выразителен, но требует некоторого привыкания. Позаботьтесь о том, чтобы, хотя CF обычно не учитывал регистр, XPath - это. Я скопировал случай из вашего CF, но это должно совпадать с регистром в XML, чтобы работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...