2009-01-30 1 views
4

Я вижу что-то очень странное в приложении Flex, которое я поддерживаю.Журналирование, вызывающее разбор XML-синтаксиса?

Я прошел через него, удалив все вызовы trace() и заменив его на вызовы в фреймворк регистрации (используя встроенный материал mx.logging). После этого некоторые XML синтаксический код внезапно сломался, и я не могу для жизни понять, почему.

вот код:

private var loader:URLLoader; // created elsewhere 

private function handleComplete(event:Event):void {  
    default xml namespace = com; 
    xml = XML(loader.data); 
    var response:XML = new XML(xml..raniResponse); 
    //now handles a null response object 
    if(xml && response.children().length() > 0) { 
    LOG.debug("Got response."); 
    var cityXML:XML = new XML(xml..city); 
    var stateXML:XML = new XML(xml..stateProv); 
    /* Some extra processing is done here */ 
    } 
} 

С кодом, как это, с этим log.debug() вызова на месте, я получаю следующее сообщение об ошибке на линии cityXML определяется:

TypeError: Error #1088: The markup in the document following the root element must be well-formed. 

Если я прокомментирую вызов LOG.debug(), он отлично работает.

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

Кто-нибудь знает, что происходит? Почему вызов журнала прерывает разбор XML? Я не могу думать ни о чем, что это могло бы сделать, это сломало бы его.

EDIT:

Я сделал еще несколько тестов, и это просто получать страннее.

Я изменил код на основе комментария Дэвида, чтобы использовать xml..city [0] вместо нового XML (xml..city) для обоих назначений. Это заставило исключение произойти чуть позже (в некотором коде, который не показан выше, где он ссылается на cityXML). Поэтому я попытался пройти через отладчик и заметил что-то странное.

cityXML был установлен в null, а stateXML получал правильное значение. Глядя на объект xml в отладчике, он показал все правильные данные, поэтому все должно быть хорошо. В качестве случайного теста я перестроил код так, чтобы сначала загружался stateXML. После этого stateXML имеет значение null, а cityXML - правильно.

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

Вот (несколько продезинфицировать) XML, который разбираемый:

<?xml version="1.0" encoding="utf-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
    <com:MyCompanyRANIv.01 xmlns:com="com:myc:rani:1:0:message" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
     <com:raniResponse> 
     <com:telephonyInfo> 
      <com:countryCode>1</com:countryCode> 
      <com:telephoneNumber>14121234567</com:telephoneNumber> 
     </com:telephonyInfo> 
     <com:geoInfo> 
      <com:coordinates> 
      <com:latLon> 
       <com:lat>40.49</com:lat> 
       <com:lon>-79.92</com:lon> 
      </com:latLon> 
      </com:coordinates> 
      <com:countryInfo> 
      <com:country> 
       <com:featureName>United States</com:featureName> 
       <com:featureTypeDescription>United States of America</com:featureTypeDescription> 
       <com:featureCode value="US" system="ISO 3166" family="Country Code" systemVer="1-alpha-2" /> 
      </com:country> 
      </com:countryInfo> 
      <com:stateProvInfo> 
      <com:stateProv> 
       <com:featureName>PENNSYLVANIA</com:featureName> 
       <com:featureTypeDescription xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 
       <com:featureCode family="US State Code" system="FIPS State Alpha Code" systemVer="" value="PA" /> 
      </com:stateProv> 
      </com:stateProvInfo> 
      <com:regionInfo> 
      <com:region> 
       <com:featureName xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 
       <com:featureTypeDescription xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 
       <com:featureCode family="" system="" systemVer="" value="" /> 
      </com:region> 
      </com:regionInfo> 
      <com:countyParishInfo> 
      <com:countyParish> 
       <com:featureName>ALLEGHENY</com:featureName> 
       <com:featureTypeDescription xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 
       <com:featureCode family="" system="" systemVer="" value="" /> 
      </com:countyParish> 
      </com:countyParishInfo> 
      <com:cityInfo> 
      <com:city> 
       <com:featureName>PITTSBURGH</com:featureName> 
       <com:featureTypeDescription xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 
       <com:featureCode family="" system="" systemVer="" value="" /> 
      </com:city> 
      </com:cityInfo> 
      <com:buildingInfo> 
      <com:building> 
       <com:featureName xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 
       <com:featureTypeDescription xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> 
      </com:building> 
      </com:buildingInfo> 
      <com:streetAddress address="" /> 
     </com:geoInfo> 
     <com:services host="false" wireless="false" other="false" /> 
     </com:raniResponse> 
     <com:raniRequest> 
     <com:fullyQualifiedTelephoneNumber>14121234567</com:fullyQualifiedTelephoneNumber> 
     </com:raniRequest> 
    </com:MyCompanyRANIv.01> 
    </soapenv:Body> 
</soapenv:Envelope> 
+0

Вы можете разместить XML вы пытаться войти? – typeoneerror

ответ

1

Опубликовать это как ответ вместо редактирование, поскольку оно включает некоторые обходные пути.

Я проверил еще несколько тестов. Вот соответствующий код из первой:

LOG.debug("Got response:"); 
var cityXML:XML = xml..city[0]; 
var stateXML:XML = xml..stateProv[0]; 

Пошаговое с помощью отладчика, cityXML присваивается пустое значение, в то время как stateXML получает правильное значение.

Далее я попытался это:

LOG.debug("Got response:"); 
trace("foobar"); 
var cityXML:XML = xml..city[0]; 
var stateXML:XML = xml..stateProv[0]; 

Это сработало! (Зачем?!). И cityXML, и stateXML получили правильные значения.

Не удовлетворены этим, я попробовал еще один тест. Я подумал, может быть, мне просто нужна была другая операция между журналом и первым заданием (не знаю, ПОЧЕМУ, но просто экспериментируйте здесь). Поэтому я пробовал это:

LOG.debug("Got response:"); 
var someDumbVariable:Number = 42; 
var cityXML:XML = xml..city[0]; 
var stateXML:XML = xml..stateProv[0]; 

Это не помогло. Итак, еще один тест:

LOG.debug("Got response:"); 
var cityXML:XML = xml..city[0]; 
cityXML = xml..city[0]; 
var stateXML:XML = xml..stateProv[0]; 

Это сработало! При переходе с отладчиком первое назначение заканчивается тем, что значение cityXML равно null. Однако второе присвоение ему дает правильное значение. (Я пробовал просто разбивать строку cityXML на объявление в одной строке, а назначение на другое, но это не меняло поведения. 2 назначения казались необходимыми).

Другой обходной путь:

LOG.debug("Got response:"); 
if(xml.length() == 0) { return; } 
var cityXML:XML = xml..city[0]; 
var stateXML:XML = xml..stateProv[0]; 

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

+0

Поскольку мой единственный ответ до сих пор на самом деле имеет рабочие обходные пути, я собираюсь его принять, но мне бы это понравилось, если бы кто-нибудь смог найти лучший ответ! – Herms

1

Это жесткая один. Я никогда не использовал классы регистрации, так что я не уверен в этой части вопроса, но преобразования XMLList в XML, как вы делаете:

var cityXML:XML = new XML(xml..city); 
только

работает, если XMLList содержит один элемент, в противном случае вы получите предупреждение, которое вы указали. Тогда попробуйте использовать следующую форму:

var cityXML:XML = xml..city[0]; 

Это работает для пустых списков, а также для списков со многими элементами. Вы также можете проверить количество детей с xml..city.length() и зарегистрировать предупреждающее сообщение, если оно не является 1. Возможно, это поможет выяснить точную проблему.

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

(На несколько связанной ноте, я заметил, что объявление и присваивая значение переменной XML в пределах case блока переключателя заявление не работает, как ожидалось, то есть присвоение просто игнорируется, а переменная не будет мне нужно присвоить значение. Ломать строку в двух случаях помогает. Это также показалось мне ошибкой, поэтому, возможно, не все правильно с компиляцией связанного с XML кода в AS3.)

+0

Глядя на анализируемый XML, существует только один «городской» узел. То же самое происходит с другими вещами. Поэтому теоретически преобразование XML должно работать нормально. – Herms

+0

Теоретически, да. Но, как я уже указывал, могут возникнуть некоторые проблемы с обработкой XML, поэтому я предложил попробовать альтернативную нотацию. Нет никакого вреда в попытках. :-) –

+0

Да, я попробовал. Он переместил ошибку в другое место в коде. Я обновил вопрос с подробностями. – Herms

0

Хм. Это очень похоже на проблему, о которой я упомянул. Попробуйте это: переместить объявления переменных XML в главе функции:

private function handleComplete(event:Event):void {  
    var cityXML:XML; 
    var stateXML:XML; 

    default xml namespace = com; 
    xml = XML(loader.data); 
    var response:XML = new XML(xml..raniResponse); 
    //now handles a null response object 
    if(xml && response.children().length() > 0) { 
    LOG.debug("Got response."); 
    cityXML = new XML(xml..city); 
    stateXML = new XML(xml..stateProv); 
    /* Some extra processing is done here */ 
    } 
} 

(. Сообщение как отдельный ответ, потому что он так сильно отличается от предыдущего)

+0

Нет, никаких изменений в поведении. Я думаю, что он имеет меньше общего с переменной и больше связан с доступом к XML. По какой-то причине первый раз, пытаясь получить доступ к нему, работает неправильно. – Herms

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