<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>裁纸刀下 &#187; bug</title>
	<atom:link href="http://ofcss.com/tags/bug/feed" rel="self" type="application/rss+xml" />
	<link>http://ofcss.com</link>
	<description>独立 自由 诚信 宽容 责任 平常心</description>
	<lastBuildDate>Fri, 20 Apr 2012 04:08:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>webkit中BFC元素临近浮动元素时的边距bug</title>
		<link>http://ofcss.com/2010/10/30/bfc-element-margin-bug-in-webkit.html</link>
		<comments>http://ofcss.com/2010/10/30/bfc-element-margin-bug-in-webkit.html#comments</comments>
		<pubDate>Sat, 30 Oct 2010 15:03:45 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[网页]]></category>

		<guid isPermaLink="false">http://ofcss.com/2010/10/30/bfc-element-margin-bug-in-webkit.html</guid>
		<description><![CDATA[一直以来我们都很熟悉IE的“浮动边距加倍”的bug，并且绝大多数重构人员都已经很擅长在需要浮动时就直接绕过他。其实以webkit为核心的浏览器，包括但不限于Safari和Chrome，也有一个关于浮动和边距的bug，同样会造成布局错误。我在最近三个月的前一个月连续遭遇了两次这个bug，后两个月虽然避免了再次出现，但是直到现在才把这个bug彻底弄清楚。 触发这个bug的条件是： 在一个非浮动元素上应用overflow，且其值不为visible（这将形成一个Block Formatting Context元素）。 这个BFC元素拥有一个浮动的兄弟元素。 在这个BFC元素上应用与其兄弟元素浮动方向相同的margin。 这个BFC元素没有指定宽度值（或者指定width:auto） 当满足触发条件时，该BFC元素的另一侧的边距将不再受css控制（在webkit核心浏览器下），而是由你所指定的与浮动元素相同的边距决定，即使你在css中明确指定另一侧的边距为0或任意值也没用。具体来说，可以分为两种情况： 当BFC与浮动方向相同的边距小于或等于浮动元素占据的总宽度（width+margin+padding+border）时，BFC另一侧的边距等于所设定方向上的边距（下图前两种情况）； 当BFC与浮动方向相同的边距大于浮动元素占据的总宽度时，BFC另一侧的边距等于浮动元素占据的总宽度（下图第三种情况）。 第一种情况：main的左边距为50px，小于sider的总宽度100px，于是它右侧自动出现了50px的边距（等于margin-left）； 第二种情况：main的左边距为100px，等于sider的总宽度100px，于是它右侧自动出现了100px的边距（等于margin-left）； 第三种情况：main的左边距为150px，大于sider的总宽度100px，于是它右侧自动出现了100px的边距（等于sider总宽度）； 以上截图来自这个demo页面，你可以用Safari或者Chrome自己打开查看具体情况。 要解决这个bug，只要让前面所说的四个条件任意一个不满足即可。例如：去除BFC元素上的overflow（但是很多时候我们需要这个overflow）；或者给BFC指定宽度（但是这样就失去了main自适应宽度的优势）。 最佳做法，当overflow和margin都必不可少的时候，把BFC的margin-left改成浮动元素的margin-right。 相关日志2011-03-12 -- 自适应的多列图文混排改进2010-10-31 -- CSS技巧:如何避免IE6中的&#34;浮动下坠&#34;【译】2010-10-20 -- clearfix改良及overflow:hidden详解【译】2009-12-21 -- 前台开发从头说起：理解css盒模型2009-12-16 -- 前台开发从头说起：谈谈CSS选择符2009-12-15 -- 前台开发从头说起：关于web标准化2009-06-22 -- Whatever:hover &#8211; 无需javascript让IE支持丰富伪类2009-04-16 -- 来自微软站点的纯CSS下拉菜单2009-04-13 -- 简单、通用的JQuery Tab实现2006-04-04 -- 动态实现指定图片半透明及鼠标事件]]></description>
			<content:encoded><![CDATA[<p>一直以来我们都很熟悉IE的“浮动边距加倍”的bug，并且绝大多数重构人员都已经很擅长在需要浮动时就直接绕过他。其实以webkit为核心的浏览器，包括但不限于Safari和Chrome，也有一个关于浮动和边距的bug，同样会造成布局错误。我在最近三个月的前一个月连续遭遇了两次这个bug，后两个月虽然避免了再次出现，但是直到现在才把这个bug彻底弄清楚。</p>
<p>  <span id="more-1019"></span>
<p>触发这个bug的条件是：</p>
<ul>
<li>在一个非浮动元素上应用overflow，且其值不为visible（这将形成一个Block Formatting Context元素）。 </li>
<li>这个BFC元素拥有一个浮动的兄弟元素。 </li>
<li>在这个BFC元素上应用与其兄弟元素浮动方向相同的margin。 </li>
<li>这个BFC元素没有指定宽度值（或者指定width:auto） </li>
</ul>
<p>当满足触发条件时，该BFC元素的另一侧的边距将不再受css控制（在webkit核心浏览器下），而是由你所指定的与浮动元素相同的边距决定，即使你在css中明确指定另一侧的边距为0或任意值也没用。具体来说，可以分为两种情况：</p>
<ul>
<li>当BFC与浮动方向相同的边距小于或等于浮动元素占据的总宽度（width+margin+padding+border）时，BFC另一侧的边距等于所设定方向上的边距（下图前两种情况）； </li>
<li>当BFC与浮动方向相同的边距大于浮动元素占据的总宽度时，BFC另一侧的边距等于浮动元素占据的总宽度（下图第三种情况）。 </li>
</ul>
<p align="center"><a href="http://file.wukangrui.com/attachments/2010/10/image7.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://file.wukangrui.com/attachments/2010/10/image_thumb7.png" width="478" height="347" /></a></p>
<ul>
<li>第一种情况：main的左边距为50px，小于sider的总宽度100px，于是它右侧自动出现了50px的边距（等于margin-left）； </li>
<li>第二种情况：main的左边距为100px，等于sider的总宽度100px，于是它右侧自动出现了100px的边距（等于margin-left）； </li>
<li>第三种情况：main的左边距为150px，大于sider的总宽度100px，于是它右侧自动出现了100px的边距（等于sider总宽度）； </li>
</ul>
<p>以上截图来自这个<a href="http://ofcss.com/cssdemo/webkit-bfc-bug.html">demo页面</a>，你可以用Safari或者Chrome自己打开查看具体情况。</p>
<p>要解决这个bug，只要让前面所说的四个条件任意一个不满足即可。例如：去除BFC元素上的overflow（但是很多时候我们需要这个overflow）；或者给BFC指定宽度（但是这样就失去了main自适应宽度的优势）。</p>
<p>最佳做法，当overflow和margin都必不可少的时候，把BFC的margin-left改成浮动元素的margin-right。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2011-03-12 -- <a href="http://ofcss.com/2011/03/12/flexible-two-column-layout-reloaded.html" title="自适应的多列图文混排改进">自适应的多列图文混排改进</a></li><li>2010-10-31 -- <a href="http://ofcss.com/2010/10/31/prevent-a-float-drop-in-ie6-translation.html" title="CSS技巧:如何避免IE6中的&quot;浮动下坠&quot;【译】">CSS技巧:如何避免IE6中的&quot;浮动下坠&quot;【译】</a></li><li>2010-10-20 -- <a href="http://ofcss.com/2010/10/20/clearfix-reloaded-overflowhidden-demystified-translation.html" title="clearfix改良及overflow:hidden详解【译】">clearfix改良及overflow:hidden详解【译】</a></li><li>2009-12-21 -- <a href="http://ofcss.com/2009/12/21/web-developer-understand-css-box-model.html" title="前台开发从头说起：理解css盒模型">前台开发从头说起：理解css盒模型</a></li><li>2009-12-16 -- <a href="http://ofcss.com/2009/12/16/web-developer-about-css-selector.html" title="前台开发从头说起：谈谈CSS选择符">前台开发从头说起：谈谈CSS选择符</a></li><li>2009-12-15 -- <a href="http://ofcss.com/2009/12/15/web-developer-from-web-standard.html" title="前台开发从头说起：关于web标准化">前台开发从头说起：关于web标准化</a></li><li>2009-06-22 -- <a href="http://ofcss.com/2009/06/22/whatever-hover-pseudo-class-without-javascript.html" title="Whatever:hover &#8211; 无需javascript让IE支持丰富伪类">Whatever:hover &#8211; 无需javascript让IE支持丰富伪类</a></li><li>2009-04-16 -- <a href="http://ofcss.com/2009/04/16/best-practices-of-css-dropdown-menu.html" title="来自微软站点的纯CSS下拉菜单">来自微软站点的纯CSS下拉菜单</a></li><li>2009-04-13 -- <a href="http://ofcss.com/2009/04/13/portable-interchangeable-jquery-based-tabs.html" title="简单、通用的JQuery Tab实现">简单、通用的JQuery Tab实现</a></li><li>2006-04-04 -- <a href="http://ofcss.com/2006/04/04/dynamic-mouse-event-of-image-transparency.html" title="动态实现指定图片半透明及鼠标事件">动态实现指定图片半透明及鼠标事件</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2010/10/30/bfc-element-margin-bug-in-webkit.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>动易SW中的一个严重但不影响使用的bug（二）</title>
		<link>http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html</link>
		<comments>http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html#comments</comments>
		<pubDate>Sun, 22 Jun 2008 18:24:00 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[动易]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">http://wukangrui.net/?p=282</guid>
		<description><![CDATA[　　上次分析出来了Bug的问题所在，是因为selectSingleNode(strNodeName)不能取到要取的元素，但是为什么这么大的Bug没有出现500错误呢？否则的话，这么大的一个bug不要说是来到用户手上，在开发人员手里就已经被发现了。 　　这次继续分析这个Bug。在新版本的API_Function.asp这个文件中，selectSingleNode这个函数一共用到了5次，有两次是在SendPost函数里，在很早的版本里那两个地方就用的是selectSingleNode，因为那里传递的参数用的是“//status”和“//message”，是正确的XPath，因此不用考虑那里了。此外的三处，代码如下： '************************************************** '函数名：getNodeText '作 用：获取XML文件中指定节点的文本 '参 数：strNodeName ----节点名称 '返回值：解析出来的文本值， '************************************************** Function getNodeText(strNodeName) If IsNull(strNodeName) Or IsEmpty(strNodeName) Or strNodeName = "" Then Exit Function If IsNode(strNodeName) Then getNodeText = sMyXmlDoc.documentElement.selectSingleNode(strNodeName).Text Else getNodeText = "" End If End Function '************************************************** '函数名：setNodeText '作 用：设置XML文件中指定节点的文本 '参 数：strNodeName ----节点名称 '　　　　strNodeText ----要设置的文本 '返回值：0 = 设置成功; 否则返回Err.Description '************************************************** Function setNodeText(strNodeName, strNodeText) [...]]]></description>
			<content:encoded><![CDATA[<p>　　<a href="http://blog.oophome.net/?id=279" target="_blank">上次</a>分析出来了Bug的问题所在，是因为selectSingleNode(strNodeName)不能取到要取的元素，但是为什么这么大的Bug没有出现500错误呢？否则的话，这么大的一个bug不要说是来到用户手上，在开发人员手里就已经被发现了。</p>
<p>　　这次继续分析这个Bug。在新版本的API_Function.asp这个文件中，selectSingleNode这个函数一共用到了5次，有两次是在SendPost函数里，在很早的版本里那两个地方就用的是selectSingleNode，因为那里传递的参数用的是“//status”和“//message”，是正确的XPath，因此不用考虑那里了。此外的三处，代码如下：<span id="more-282"></span></p>
<pre lang="ASP">'**************************************************
'函数名：getNodeText
'作  用：获取XML文件中指定节点的文本
'参  数：strNodeName   ----节点名称
'返回值：解析出来的文本值，
'**************************************************
Function getNodeText(strNodeName)
    If IsNull(strNodeName) Or IsEmpty(strNodeName) Or strNodeName = "" Then Exit Function
    If IsNode(strNodeName) Then
        getNodeText = sMyXmlDoc.documentElement.selectSingleNode(strNodeName).Text
    Else
        getNodeText = ""
    End If
End Function  

'**************************************************
'函数名：setNodeText
'作  用：设置XML文件中指定节点的文本
'参  数：strNodeName   ----节点名称
'　　　　strNodeText   ----要设置的文本
'返回值：0 = 设置成功; 否则返回Err.Description
'**************************************************
Function setNodeText(strNodeName, strNodeText)
    If IsNull(strNodeText) Or IsEmpty(strNodeText) Or strNodeText = "" Then Exit Function
    If IsNull(strNodeName) Or IsEmpty(strNodeName) Or strNodeName = "" Then Exit Function
    If IsNode(strNodeName) Then sMyXmlDoc.documentElement.selectSingleNode(strNodeName).Text = strNodeText
End Function  

'**************************************************
'函数名：IsNode
'作  用：检查一个Node是否存在且文本不为空
'参  数：strNodeName   ----节点名称
'返回值：True or False
'**************************************************
Function IsNode(strNodeName)
    IsNode = False
    If strNodeName = "" Then Exit Function
    If sMyXmlDoc.documentElement.selectSingleNode(strNodeName) Is Nothing Then
        IsNode = False
    Else
        IsNode = True
    End If
End Function</pre>
<p>　　我们来看，为什么设置message的值不会成功并且不报错呢？原因就在于setNodeText这个函数的最后一句：</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
<li class="alt"><span><span class="keyword">If</span><span> IsNode(strNodeName) </span><span class="keyword">Then</span><span> sMyXmlDoc.documentElement.selectSingleNode(strNodeName).Text = strNodeText  </span></span></li>
</ol>
</div>
<p>　　IsNode这个函数，从函数的注释（还好这个没改）可以看出，作用是“检测一个元素是否存在<span style="color: #ff0000;">且文本不为空</span>”，这个函数本来的作用是用于检查传递的数据包中的“自定义元素”和“扩展元素”的，因为各个接口对标准的支持程度不同，因此在获取数据的时候，有的元素可能只是穿了空值过来，那我们就没有必要对该元素进行处理了，所以要用IsNode来检查一下。但是在setNodeText这个函数里没有调用过IsNode检查。就算调用了，按照以前的方式，一定会取到“message”元素的默认值，从而返回True。</p>
<p>　　在新版本中，由于采用了selectSingleNode来取“message”已经取不到了，自然，IsNode这个函数在检查到message的时候，必然返回空值，因为 sMyXmlDoc.documentElement.selectSingleNode Is Nothing这个判断为真了，所以会返回False。于是，sMyXmlDoc.documentElement.selectSingleNode(“message”).Text 这个语句就不会执行，也就不会引发500错误了。</p>
<p>　　做个假设，如果在修改了取元素的方式之后，没有给setNodeText和getNodeText加上IsNode判断，则必然引发500错误。或者，没有修改过IsNode这个函数，则仍然会返回True，然后引发500错误。正好是加上了判断，于是所有对message元素的值的读写都被忽略了，默认值“操作已成功”就这样被原封不动地回发给所有请求，而响应包中的用户数据元素也一样。</p>
<p>　　下面是纠正bug的代码：</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
<li class="alt"><span><span class="comment">&#8216;************************************************** </span><span>  </span></span></li>
<li><span class="comment">&#8216;函数名：getNodeText </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;作  用：获取XML文件中指定节点的文本 </span><span>  </span></li>
<li><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;返回值：解析出来的文本值， </span><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="keyword">Function</span><span> getNodeText(strNodeName)   </span></li>
<li><span>    </span><span class="keyword">If</span><span> IsNull(strNodeName) </span><span class="keyword">Or</span><span> IsEmpty(strNodeName) </span><span class="keyword">Or</span><span> strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">If</span><span> IsNode(strNodeName) </span><span class="keyword">Then</span><span>  </span></li>
<li><span>        getNodeText = sMyXmlDoc.documentElement.<span style="background-color: #ffff00">getElementsByTagName(strNodeName).Item(0)</span>.Text   </span></li>
<li class="alt"><span>    </span><span class="keyword">Else</span><span>  </span></li>
<li><span>        getNodeText = </span><span class="string">“”</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">End</span><span> </span><span class="keyword">If</span><span>  </span></li>
<li><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;函数名：setNodeText </span><span>  </span></li>
<li><span class="comment">&#8216;作  用：设置XML文件中指定节点的文本 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称 </span><span>  </span></li>
<li><span class="comment">&#8216;　　　　strNodeText   &#8212;-要设置的文本 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;返回值：0 = 设置成功; 否则返回Err.Description </span><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="keyword">Function</span><span> setNodeText(strNodeName, strNodeText)   </span></li>
<li><span>    </span><span class="keyword">If</span><span> IsNull(strNodeText) </span><span class="keyword">Or</span><span> IsEmpty(strNodeText) </span><span class="keyword">Or</span><span> strNodeText = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">If</span><span> IsNull(strNodeName) </span><span class="keyword">Or</span><span> IsEmpty(strNodeName) </span><span class="keyword">Or</span><span> strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li><span>    </span><span class="keyword">If</span><span> IsNode(strNodeName) </span><span class="keyword">Then</span><span> sMyXmlDoc.documentElement.<span style="background-color: #ffff00">getElementsByTagName(strNodeName).Item(0)</span>.Text = strNodeText   </span></li>
<li><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;函数名：IsNode </span><span>  </span></li>
<li><span class="comment">&#8216;作  用：检查一个Node是否存在且文本不为空 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称 </span><span>  </span></li>
<li><span class="comment">&#8216;返回值：True or False </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li><span class="keyword">Function</span><span> IsNode(strNodeName)   </span></li>
<li class="alt"><span>    IsNode = </span><span class="keyword">False</span><span>  </span></li>
<li><span>    </span><span class="keyword">If</span><span> strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">If</span><span> sMyXmlDoc.documentElement.<span style="background-color: #ffff00">getElementsByTagName(strNodeName).Item(0)</span> </span><span class="keyword">Is</span><span> </span><span class="keyword">Nothing</span><span style="background-color: #ffff00"> Or IsEmpty(sMyXmlDoc.documentElement.getElementByTagName(strNodeName).Item(0).Text) </span><span class="keyword">Then</span><span>  </span></li>
<li><span>        IsNode = </span><span class="keyword">False</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">Else</span><span>  </span></li>
<li><span>        IsNode = </span><span class="keyword">True</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">End</span><span> </span><span class="keyword">If</span><span>  </span></li>
<li><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></li>
</ol>
</div>
<p>第二种改法：用selectSingleNode的方法，代码如下</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
<li class="alt"><span><span class="comment">&#8216;************************************************** </span><span>  </span></span></li>
<li><span class="comment">&#8216;函数名：getNodeText </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;作  用：获取XML文件中指定节点的文本 </span><span>  </span></li>
<li><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;返回值：解析出来的文本值， </span><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="keyword">Function</span><span> getNodeText(strNodeName)   </span></li>
<li><span>    </span><span class="keyword">If</span><span> IsNull(strNodeName) </span><span class="keyword">Or</span><span> IsEmpty(strNodeName) </span><span class="keyword">Or</span><span> strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">If</span><span> IsNode(strNodeName) </span><span class="keyword">Then</span><span>  </span></li>
<li><span>        getNodeText = sMyXmlDoc.documentElement.selectSingleNode(</span><span class="string">“//”</span><span>&amp;strNodeName).Text   </span></li>
<li class="alt"><span>    </span><span class="keyword">Else</span><span>  </span></li>
<li><span>        getNodeText = </span><span class="string">“”</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">End</span><span> </span><span class="keyword">If</span><span>  </span></li>
<li><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;函数名：setNodeText </span><span>  </span></li>
<li><span class="comment">&#8216;作  用：设置XML文件中指定节点的文本 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称 </span><span>  </span></li>
<li><span class="comment">&#8216;　　　　strNodeText   &#8212;-要设置的文本 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;返回值：0 = 设置成功; 否则返回Err.Description </span><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="keyword">Function</span><span> setNodeText(strNodeName, strNodeText)   </span></li>
<li><span>    </span><span class="keyword">If</span><span> IsNull(strNodeText) </span><span class="keyword">Or</span><span> IsEmpty(strNodeText) </span><span class="keyword">Or</span><span> strNodeText = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">If</span><span> IsNull(strNodeName) </span><span class="keyword">Or</span><span> IsEmpty(strNodeName) </span><span class="keyword">Or</span><span> strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li><span>    </span><span class="keyword">If</span><span> IsNode(strNodeName) </span><span class="keyword">Then</span><span> sMyXmlDoc.documentElement.selectSingleNode(</span><span class="string">“//”</span><span>&amp;strNodeName).Text = strNodeText   </span></li>
<li class="alt"><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li><span>  </span></li>
<li class="alt"><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li><span class="comment">&#8216;函数名：IsNode </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;作  用：检查一个Node是否存在且文本不为空 </span><span>  </span></li>
<li><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称 </span><span>  </span></li>
<li class="alt"><span class="comment">&#8216;返回值：True or False </span><span>  </span></li>
<li><span class="comment">&#8216;************************************************** </span><span>  </span></li>
<li class="alt"><span class="keyword">Function</span><span> IsNode(strNodeName)   </span></li>
<li><span>    IsNode = </span><span class="keyword">False</span><span>  </span></li>
<li class="alt"><span>    </span><span class="keyword">If</span><span> strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></li>
<li><span>    </span><span class="keyword">If</span><span> sMyXmlDoc.documentElement.selectSingleNode(</span><span class="string">“//”</span><span>&amp;strNodeName) </span><span class="keyword">Is</span><span> </span><span class="keyword">Nothing</span><span> </span><span class="keyword">Or</span><span> IsEmpty(sMyXmlDoc.documentElement.selectSingleNode(</span><span class="string">“//”</span><span>&amp;strNodeName).Text) </span><span class="keyword">Then</span><span>  </span></li>
<li class="alt"><span>        IsNode = </span><span class="keyword">False</span><span>  </span></li>
<li><span>    </span><span class="keyword">Else</span><span>  </span></li>
<li class="alt"><span>        IsNode = </span><span class="keyword">True</span><span>  </span></li>
<li><span>    </span><span class="keyword">End</span><span> </span><span class="keyword">If</span><span>  </span></li>
<li class="alt"><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></li>
</ol>
</div>
<p>　　这样就能充分利用selectSingleNode的简洁了，但是还要注意哦，由于新版本的createXmlDom不再是自动生成支持的最高版本的xmldom对象，而是生成默认版本（系统默认版本一般都是3.0以下），而低于4.0的版本中，selectSingleNode对XPath的支持是有问题的，不支持带函数的XPath，所以还要小心！</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2008-06-18 -- <a href="http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html" title="动易SW中的一个严重但不影响使用的bug(一)">动易SW中的一个严重但不影响使用的bug(一)</a></li><li>2008-05-23 -- <a href="http://ofcss.com/2008/05/23/disadvantages-of-discuz-ucenter.html" title="给UCenter的拥蹩们泼点冷水">给UCenter的拥蹩们泼点冷水</a></li><li>2008-06-22 -- <a href="http://ofcss.com/2008/06/22/thinking-about-html-page-creating.html" title="静态页面生成的思考">静态页面生成的思考</a></li><li>2008-06-04 -- <a href="http://ofcss.com/2008/06/04/unix-timestamp-in-asp.html" title="在ASP中实现UNIX时间戳">在ASP中实现UNIX时间戳</a></li><li>2007-01-30 -- <a href="http://ofcss.com/2007/01/30/new-thinking-about-application-intergration.html" title="整合开发的新思路">整合开发的新思路</a></li><li>2006-04-12 -- <a href="http://ofcss.com/2006/04/12/innerhtml-can-not-be-excuted.html" title="用JavaScript动态输出的JS脚本不能执行">用JavaScript动态输出的JS脚本不能执行</a></li><li>2010-10-30 -- <a href="http://ofcss.com/2010/10/30/bfc-element-margin-bug-in-webkit.html" title="webkit中BFC元素临近浮动元素时的边距bug">webkit中BFC元素临近浮动元素时的边距bug</a></li><li>2009-07-08 -- <a href="http://ofcss.com/2009/07/08/asp-net-mvc-best-practices-part-4.html" title="ASP.NET MVC 最佳实践（四）">ASP.NET MVC 最佳实践（四）</a></li><li>2009-07-07 -- <a href="http://ofcss.com/2009/07/07/asp-net-mvc-best-practices-part-3.html" title="ASP.NET MVC 最佳实践（三）">ASP.NET MVC 最佳实践（三）</a></li><li>2009-07-05 -- <a href="http://ofcss.com/2009/07/05/php-5-3-0-release-new-feature.html" title="PHP 5.3.0 发布">PHP 5.3.0 发布</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>动易SW中的一个严重但不影响使用的bug(一)</title>
		<link>http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html</link>
		<comments>http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html#comments</comments>
		<pubDate>Wed, 18 Jun 2008 12:20:00 +0000</pubDate>
		<dc:creator>小李刀刀</dc:creator>
				<category><![CDATA[所谓技术]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[动易]]></category>
		<category><![CDATA[开发]]></category>

		<guid isPermaLink="false">http://wukangrui.net/?p=279</guid>
		<description><![CDATA[BUG描述：整个动易API接口的响应功能，除了操作状态码正常，其它部分完全失效，不会返回错误提示，也不会返回用户信息。 BUG重现：在启用了整合的站点，直接访问/API/API_Response.asp，将会看到&#60;status&#62;1&#60;/status&#62;（表示请求不正确或者操作失败），以及&#60;message&#62;操作已成功完成&#60;/message&#62;（操作成功返回的默认值）。就表示该BUG存在。 BUG影响：大部分情况下，各个应用程序并不会向动易请求用户信息，因此除了在登陆失败、注册失败等失败操作会提示用户“操作已成功”的假象以外，暂时不会造成其它影响。 　　动易SW里有这样一个问题，只有启用了整合接口并且曾经在整合的其它系统中遇到过错误提示的朋友才会发现： 　　每当整合出现问题或者是登陆、注册等一系列操作出错的时候，我们知道以前是返回错误的具体提示，包括服务器缺乏相关组件，或者接口配置错误，或者用户信息错误等，都会有不同的提示。到了SW里，这些操作同样也会返回错误，不会让你操作成功。但是错误的提示是什么呢？全部都是“操作已成功完成”，这个搞笑的问题出在哪里呢？ 　　以前设计API的时候，考虑到最常见的情况是用户注册、登陆、注销这些日常操作，而这些操作里又是成功的居多，所以我在用于返回信息的Response.xml模板里，设置了默认返回状态为0（表示成功），默认返回信息为“操作已成功完成”。这就是这个bug的缘起了。 　　那么，以前老的版本反而没有这个问题，为什么新版本里出现这个问题呢？第一反应：当出现错误的时候，没有修改message，也就是错误提示信息。好，我们打开API_Response.asp检查一下，发现当操作错误的时候，代码是这样的： If FoundErr Then sPE_Items(conStatus, 1) = "1" sPE_Items(conMessage, 1) = ErrMsg prepareXML (False) WriteXml Else sPE_Items(conStatus, 1) = "0" prepareXML (False) WriteXml End If 　　我用黄色背景标记的这行，翻译过来就是“设置提示信息的内容为ErrMsg（具体的错误信息）”，说明不是没有修改，于是我们继续往下查，sPE_Items这是一个API使用的全局数组，二维的，sPE_Items(a, b)，a代表xml里的不同元素，b为0标识我们要访问的是元素名称，1标识我们要访问的是元素里的内容；而conMessage是一个常数，实际上它等于4。在全局数组里sPE_Items(4, 1)代表的就是xml中message这个元素的内容。 　　接下来是prepareXML(False)这个函数。这个函数的作用是加载xml模板，然后用数组里的内容去替换默认值。经检查，在prepareXML这个函数里，当返回出错信息的时候的代码如下： ASP/Visual Basic代码 If intIndex &#60;&#62; conAction And intIndex &#60;&#62; conSyskey And intIndex &#60;&#62; conUsername Then setNodeText sPE_Items(intIndex,0),sPE_Items(intIndex,1) End If 　　这里不会有什么问题，看来问题就出在setNodeText这个函数上了。新版本中的这个函数是： [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>BUG描述：整个动易API接口的响应功能，除了操作状态码正常，其它部分完全失效，不会返回错误提示，也不会返回用户信息。</p>
<p>BUG重现：在启用了整合的站点，直接访问/API/API_Response.asp，将会看到<span style="color: #339966;">&lt;status&gt;<span style="color: #ff0000;">1</span>&lt;/status&gt;</span>（表示请求不正确或者操作失败），以及<span style="color: #339966;">&lt;message&gt;<span style="color: #ff0000;">操作已成功完成</span>&lt;/message&gt;</span>（操作成功返回的默认值）。就表示该BUG存在。</p>
<p>BUG影响：大部分情况下，各个应用程序并不会向动易请求用户信息，因此除了在登陆失败、注册失败等失败操作会提示用户“操作已成功”的假象以外，暂时不会造成其它影响。</p></blockquote>
<p><span id="more-279"></span><br />
　　动易SW里有这样一个问题，只有启用了整合接口并且曾经在整合的其它系统中遇到过错误提示的朋友才会发现：</p>
<p>　　每当整合出现问题或者是登陆、注册等一系列操作出错的时候，我们知道以前是返回错误的具体提示，包括服务器缺乏相关组件，或者接口配置错误，或者用户信息错误等，都会有不同的提示。到了SW里，这些操作同样也会返回错误，不会让你操作成功。但是错误的提示是什么呢？全部都是“操作已成功完成”，这个搞笑的问题出在哪里呢？</p>
<p>　　以前设计API的时候，考虑到最常见的情况是用户注册、登陆、注销这些日常操作，而这些操作里又是成功的居多，所以我在用于返回信息的Response.xml模板里，设置了默认返回状态为0（表示成功），默认返回信息为“操作已成功完成”。这就是这个bug的缘起了。</p>
<p>　　那么，以前老的版本反而没有这个问题，为什么新版本里出现这个问题呢？第一反应：当出现错误的时候，没有修改message，也就是错误提示信息。好，我们打开API_Response.asp检查一下，发现当操作错误的时候，代码是这样的：</p>
<pre lang="ASP">If FoundErr Then
    sPE_Items(conStatus, 1) = "1"
    sPE_Items(conMessage, 1) = ErrMsg
    prepareXML (False)
    WriteXml
Else
    sPE_Items(conStatus, 1) = "0"
    prepareXML (False)
    WriteXml
End If</pre>
<p>　　我用黄色背景标记的这行，翻译过来就是“设置提示信息的内容为ErrMsg（具体的错误信息）”，说明不是没有修改，于是我们继续往下查，sPE_Items这是一个API使用的全局数组，二维的，sPE_Items(a, b)，a代表xml里的不同元素，b为0标识我们要访问的是元素名称，1标识我们要访问的是元素里的内容；而conMessage是一个常数，实际上它等于4。在全局数组里sPE_Items(4, 1)代表的就是xml中message这个元素的内容。</p>
<p>　　接下来是prepareXML(False)这个函数。这个函数的作用是加载xml模板，然后用数组里的内容去替换默认值。经检查，在prepareXML这个函数里，当返回出错信息的时候的代码如下：</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
<li class="alt"><span><span class="keyword">If</span><span> intIndex &lt;&gt; conAction </span><span class="keyword">And</span><span> intIndex &lt;&gt; conSyskey </span><span class="keyword">And</span><span> intIndex &lt;&gt; conUsername </span><span class="keyword">Then</span><span>  </span></span></li>
<li><span>    setNodeText sPE_Items(intIndex,0),sPE_Items(intIndex,1)  </span></li>
<li class="alt"><span><span class="keyword">End</span><span> </span><span class="keyword">If</span><span>  </span></span></li>
</ol>
</div>
<p>　　这里不会有什么问题，看来问题就出在setNodeText这个函数上了。新版本中的这个函数是：</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
<li class="alt"><span><span class="comment">&#8216;**************************************************</span><span>  </span></span></li>
<li><span><span class="comment">&#8216;函数名：setNodeText</span><span>  </span></span></li>
<li class="alt"><span><span class="comment">&#8216;作  用：设置XML文件中指定节点的文本</span><span>  </span></span></li>
<li><span><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称</span><span>  </span></span></li>
<li class="alt"><span><span class="comment">&#8216;　　　　strNodeText   &#8212;-要设置的文本</span><span>  </span></span></li>
<li><span><span class="comment">&#8216;返回值：0 = 设置成功; 否则返回Err.Description</span><span>  </span></span></li>
<li class="alt"><span><span class="comment">&#8216;**************************************************</span><span>  </span></span></li>
<li><span><span class="keyword">Function</span><span> setNodeText(strNodeName, strNodeText)  </span></span></li>
<li class="alt"><span>    <span class="keyword">If</span><span> IsNull(strNodeText) </span><span class="keyword">Or</span><span> IsEmpty(strNodeText) or strNodeText = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></span></li>
<li><span>    <span class="keyword">If</span><span> IsNull(strNodeName) </span><span class="keyword">Or</span><span> IsEmpty(strNodeName) or strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></span></li>
<li class="alt"><span>    <span class="keyword">If</span><span> IsNode(strNodeName) </span><span class="keyword">Then</span><span> sMyXmlDoc.<span style="background-color: #ffff00">selectSingleNode(strNodeName).text</span> = strNodeText  </span></span></li>
<li><span><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></span></li>
</ol>
</div>
<p>　　以前的版本中代码是：</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
<li class="alt"><span><span class="comment">&#8216;**************************************************</span><span>  </span></span></li>
<li><span><span class="comment">&#8216;函数名：setNodeText</span><span>  </span></span></li>
<li class="alt"><span><span class="comment">&#8216;作  用：设置XML文件中指定节点的文本</span><span>  </span></span></li>
<li><span><span class="comment">&#8216;参  数：strNodeName   &#8212;-节点名称</span><span>  </span></span></li>
<li class="alt"><span><span class="comment">&#8216;　　　　strNodeText   &#8212;-要设置的文本</span><span>  </span></span></li>
<li><span><span class="comment">&#8216;返回值：0 = 设置成功; 否则返回Err.Description</span><span>  </span></span></li>
<li class="alt"><span><span class="comment">&#8216;**************************************************</span><span>  </span></span></li>
<li><span><span class="keyword">Function</span><span> setNodeText(strNodeName, strNodeText)  </span></span></li>
<li class="alt"><span>    <span class="keyword">If</span><span> IsNull(strNodeText) </span><span class="keyword">Or</span><span> IsEmpty(strNodeText) or strNodeText = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>  </span></span></li>
<li><span>    <span class="keyword">If</span><span> IsNull(strNodeName) </span><span class="keyword">Or</span><span> IsEmpty(strNodeName) or strNodeName = </span><span class="string">“”</span><span> </span><span class="keyword">Then</span><span> </span><span class="keyword">Exit</span><span> </span><span class="keyword">Function</span><span>   </span></span></li>
<li class="alt"><span>    <span class="keyword">If</span><span> IsNode(strNodeName) </span><span class="keyword">Then</span><span> sMyXmlDoc.<span style="background-color: #ffff00">getElementsByTagName(strNodeName).Item(0).text</span> = strNodeText  </span></span></li>
<li><span><span class="keyword">End</span><span> </span><span class="keyword">Function</span><span>  </span></span></li>
</ol>
</div>
<p>　　区别就在于，新版本用selectSingleNode这个方法获取节点，以前版本中我用getElementsByTagName().Item(0)这个方法来获取节点。两个方法都是返回xml文档树中的一个元素对象。新版本的代码简洁，直接从树中读取一个元素，而我的方法是读取文档树中所有标签为strNodeName（本例中指的是message）的元素列表，然后取第一个。</p>
<p>　　我排错的时候看到这里就已经明白问题所在了。因为当初我第一次写到这里的时候就犯过新版中这个错误。selectSingleNode这个方法的参数类型是XPath，而getElementsByTagName这个方法的参数类型是string。我们这里给的“message”，不是一个XPath，如果在我们的文档中用XPath来标识这个元素，正确的应该是“/root/body/message”，但是由于sMyXmlDoc这个对象取得是xml文档树的根元素，也就是root，所以其实也可以用“/body/message”来访问到。文档中只有一个message元素，因此也可以用“//message”来访问。不管用哪一种都行，但是用“message”是不对的。</p>
<p>　　所以这里给xml中所有body的子元素赋值都会失败。这就是问题所在了。</p>
<p>　　同理可知，在新版本的接口中，如果是整合的程序向动易发送请求，那么不管什么请求，返回的xml包中，都只有两个有效数据，一个是告诉对方响应者是动易系统，另一个就是告诉对方操作状态是成功还是失败。至于错误的具体提示，只有默认值，而其它的数据，比如检索用户信息，返回的则全部是空值。还好目前的整合中基本上不会用到这些元素，所以也就成了一个“严重”但不影响使用的bug了。关于这个bug为什么没有引发500错误以及如何修正，<a href="http://blog.oophome.net/article.asp?id=282" target="_blank">下次</a>我再继续说。</p>
<p>　　除此之外，动易的新版本接口还增加了一个新元素（sex），可以理解为符合接口规范的自定义元素，但是这个元素表示的是用户性别。这是在标准中定义的必备扩展元素，元素名称是gendar（英文单词意思是性别）。等于放弃了对标准元素gendar的支持，增加了一个自定义元素sex。</p>
<p>　　不知道三方是否在这个新增元素上做过沟通取得了共识。如果没有的话，那么这里又是一个新bug，就是通用注册的时候，其它程序将不能通知动易记录用户的性别，动易也没法通知其它用户。</p>
<p>　　我第一次看到这个新增元素的时候百思不得其解。如果是gendar命名不恰当，要改的话，那应该会发公告通知PDO接口规范更新到1.1或者2.0，新增sex元素，gendar元素状态变为“不推荐”，这是w3c在xhtml规范里喜欢用的方式。先不推荐但是还兼容，让你有时间慢慢改，以后时机恰当再取消。</p>
<p>　　但是我奇怪的是gendar无论从语意上讲还是从哪方面讲，都不算是命名不规范的元素啊，甚至是比sex更规范的元素。sex只不过是在部分web应用里习惯的用法而已。其英文单词意思是“性”，而不是“性别”。</p>
<p>　　莫非做这个修改的技术员在修改接口的时候不看接口规范？不得而知了。但是对于selectSingleNode不能根据元素名称选择元素这个问题，的确是不应该犯的。</p>
<p>　　发现我写的代码被更改并不是因为我写错了，本来应该是高兴的吧，但是我却高兴不起来。我依然是动易的忠实FANS，我希望它更好。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>2008-06-22 -- <a href="http://ofcss.com/2008/06/22/api-bug-in-powereasy-siteweaver-part2.html" title="动易SW中的一个严重但不影响使用的bug（二）">动易SW中的一个严重但不影响使用的bug（二）</a></li><li>2008-05-23 -- <a href="http://ofcss.com/2008/05/23/disadvantages-of-discuz-ucenter.html" title="给UCenter的拥蹩们泼点冷水">给UCenter的拥蹩们泼点冷水</a></li><li>2008-06-22 -- <a href="http://ofcss.com/2008/06/22/thinking-about-html-page-creating.html" title="静态页面生成的思考">静态页面生成的思考</a></li><li>2008-06-04 -- <a href="http://ofcss.com/2008/06/04/unix-timestamp-in-asp.html" title="在ASP中实现UNIX时间戳">在ASP中实现UNIX时间戳</a></li><li>2007-01-30 -- <a href="http://ofcss.com/2007/01/30/new-thinking-about-application-intergration.html" title="整合开发的新思路">整合开发的新思路</a></li><li>2006-04-12 -- <a href="http://ofcss.com/2006/04/12/innerhtml-can-not-be-excuted.html" title="用JavaScript动态输出的JS脚本不能执行">用JavaScript动态输出的JS脚本不能执行</a></li><li>2010-10-30 -- <a href="http://ofcss.com/2010/10/30/bfc-element-margin-bug-in-webkit.html" title="webkit中BFC元素临近浮动元素时的边距bug">webkit中BFC元素临近浮动元素时的边距bug</a></li><li>2009-07-08 -- <a href="http://ofcss.com/2009/07/08/asp-net-mvc-best-practices-part-4.html" title="ASP.NET MVC 最佳实践（四）">ASP.NET MVC 最佳实践（四）</a></li><li>2009-07-07 -- <a href="http://ofcss.com/2009/07/07/asp-net-mvc-best-practices-part-3.html" title="ASP.NET MVC 最佳实践（三）">ASP.NET MVC 最佳实践（三）</a></li><li>2009-07-05 -- <a href="http://ofcss.com/2009/07/05/php-5-3-0-release-new-feature.html" title="PHP 5.3.0 发布">PHP 5.3.0 发布</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ofcss.com/2008/06/18/api-bug-in-powereasy-siteweaver-part1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

