在我维护的flex应用程序中,我看到了一些非常奇怪的事情。
我已经完成了删除对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解析?我想不出它会做什么来破坏它。
编辑:
我又做了一些测试,结果越来越奇怪了。
我根据david的注释修改了代码,对这两个赋值都使用xml..city[0]而不是新的xml(xml..city)。这导致异常稍晚发生(在上面未显示的一些代码中,它引用了cityxml)。所以我试着进入调试器,发现了一些奇怪的东西。
CityXML被设置为空,而StateXML正在获取正确的值。在调试器中查看xml对象,显示了所有正确的数据,因此应该没问题。作为一个随机测试,我重新排列了代码,以便首先加载stateXML。这样做之后,stateXML为空,而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>

最佳答案

这是一个艰难的决定。我从未使用过日志类,所以我不确定这部分问题,但像您这样将xmllist转换为xml:

var cityXML:XML = new XML(xml..city);

仅当xmllist包含单个项时才起作用,否则将得到引用的警告。请改为使用以下表单:
var cityXML:XML = xml..city[0];

这适用于空列表以及包含许多项的列表。您还可以使用xml..city.length()检查子项的数量,如果不是1,则记录一条警告消息。也许这将有助于找出确切的问题。
但是,添加或删除日志记录调用是如何实现这一点的,这让我很吃惊。
(有点相关,我注意到在switch语句的case块中声明和分配xml变量的值并不像预期的那样工作,也就是说,赋值被简单地忽略,变量将不会被赋值。一分为二有帮助。这在我看来也是一个bug,所以在as3中编译xml相关代码可能不是所有事情都正确。)

10-08 04:56