xml - 记录导致 XML 解析中断?

标签 xml apache-flex actionscript-3 logging

我看到我正在维护的 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] 而不是 new XML(xml..city) 来完成这两项任务。这导致异常稍后发生(在上面未显示的某些代码中,它引用了 cityXML)。因此,我尝试在调试器中单步执行并发现了一些奇怪的东西。

cityXML 被设置为 null,而 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() 检查 child 的数量,如果它不是 1,则记录一条警告消息。也许这有助于找出确切的问题。

不过,我不明白这是如何通过添加或删除日志记录调用来实现的。

(在某种程度上相关的注释中,我注意到在 switch 语句的 case block 中声明 为 XML 变量赋值并没有按预期工作,即分配被简单地忽略,并且变量不会被分配一个值。将行分成两部分有帮助。这对我来说也似乎是一个错误,所以在 AS3 中编译 XML 相关代码可能并非一切都是正确的。)

关于xml - 记录导致 XML 解析中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/497420/

相关文章:

apache-flex - 我应该为 Apache Flex 使用什么 IDE?

apache-flex - 弱引用和强引用

ios - 在 Device Central 中测试 Flash iOS 应用程序

java - 使用 Java 方法格式化 HTML 页面上的文本/XML 输出

java - 有没有最好的方法来验证 Java 中 XSD 生成的 XML

java - 如何使用相同的 JAXB 类将其编码和解码到不同的命名空间中?

flash - 动态地从我的 flash 库中获取一个类

android - 此处不允许元素忽略,在 Android lint.xml 中

java - Flex 和 Java 应用程序使用什么架构

Flash AS3 定义声音结束时间