Submitted by gouki on 2010, December 8, 3:34 PM
这是今天中午发生的事情,有人在群里求助,比如xml中如果标记是<xx:xxxx>content</xx:xxxx>这样的情况下,取不到 xx:xxxx 为下标的值。
看了这个问题,第一个反应就是namespace的关系,但我从来没有使用simplexml操作过namespace,于是就翻开手册查了一下资料,问题并没有解决,最终是通过google解决了该问题。
提问题的朋友贴出了数据源,来自于:http://code.google.com/intl/zh-CN/apis/contacts/docs/3.0/developers_guide_protocol.html#retrieving_without_query,数据结构大致如下:
XML/HTML代码
- <feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/' xmlns:gContact='http://schemas.google.com/contact/2008' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/"CUMBRHo_fip7ImA9WxRbGU0."'>
- <id>liz@gmail.com</id>
- <updated>2008-12-10T10:04:15.446Z</updated>
- <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact' />
- <title>Elizabeth Bennet's Contacts</title>
- <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full' />
- <link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full' />
- <link rel='http://schemas.google.com/g/2005#batch' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full/batch' />
- <link rel='self' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full?max-results=25' />
- <author>
- <name>Elizabeth Bennet</name>
- <email>liz@gmail.com</email>
- </author>
- <generator version='1.0' uri='http://www.google.com/m8/feeds'> Contacts </generator>
- <openSearch:totalResults>1</openSearch:totalResults>
- <openSearch:startIndex>1</openSearch:startIndex>
- <openSearch:itemsPerPage>25</openSearch:itemsPerPage>
- <entry gd:etag='"Qn04eTVSLyp7ImA9WxRbGEUORAQ."'>
- <id> http://www.google.com/m8/feeds/contacts/liz%40gmail.com/base/c9012de </id>
- <updated>2008-12-10T04:45:03.331Z</updated>
- <app:edited xmlns:app='http://www.w3.org/2007/app'>2008-12-10T04:45:03.331Z</app:edited>
- <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact' />
- <title>Fitzwilliam Darcy</title>
- <gd:name>
- <gd:fullName>Fitzwilliam Darcy</gd:fullName>
- </gd:name>
- <link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*' href='https://www.google.com/m8/feeds/photos/media/liz%40gmail.com/c9012de' gd:etag='"KTlcZWs1bCp7ImBBPV43VUV4LXEZCXERZAc."' />
- <link rel='self' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full/c9012de' />
- <link rel='edit' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/liz%40gmail.com/full/c9012de' />
- <gd:phoneNumber rel='http://schemas.google.com/g/2005#home' primary='true'> 456 </gd:phoneNumber>
- <gd:extendedProperty name='pet' value='hamster' />
- <gContact:groupMembershipInfo deleted='false' href='http://www.google.com/m8/feeds/groups/liz%40gmail.com/base/270f' />
- </entry>
- </feed>
这个结构在上面的地址里有,这个是我格式化过的XML数据,现在要取得类似于“<gd:phoneNumber rel='http://schemas.google.com/g/2005#home' primary='true'> 456 </gd:phoneNumber> ”中的值。
最终代码如下:
PHP代码
- $x = new SimpleXmlElement($str);
- foreach($x->entry as $t){
- echo $t->id . "<br >";
- echo $t->updated . "<br />";
- $namespaces = $t->getNameSpaces(true);
- $gd = $t->children($namespaces['gd']);
- echo $gd->phoneNumber;
- }
当然,如果不象上面这样写,也可以写成这样:
PHP代码
- $x = new SimpleXmlElement($str);
- foreach($x->entry as $t){
- echo $t->id . "<br >";
- echo $t->updated . "<br />";
-
-
- $gd = $t->children('http://schemas.google.com/g/2005');
- echo $gd->phoneNumber;
- }
只是象第二种写法就属于硬编码了,这样不太好,万一哪天有变化,还得再更改N多代码。
问题接踵而来,比如象下面这段:
XML/HTML代码
- <event:event>
- <event:sessionKey></event:sessionKey>
- <event:sessionName>Learn QB in Minutes</event:sessionName>
- <event:sessionType>9</event:sessionType>
- <event:hostWebExID></event:hostWebExID>
- <event:startDate>02/12/2009</event:startDate>
- <event:endDate>02/12/2009</event:endDate>
- <event:timeZoneID>11</event:timeZoneID>
- <event:duration>30</event:duration>
- <event:description></event:description>
- <event:status>NOT_INPROGRESS</event:status>
- <event:panelists></event:panelists>
- <event:listStatus>PUBLIC</event:listStatus>
- </event:event>
这种非标准的XML,没有定义命名空间,怎么办?在这种情况下,其实SimpleXmlElement就已经直接可以解决了,但是会报warnging,因为他认为event这个命名空间不存在。
解决方法是:
PHP代码
- $xml = @new SimpleXmlElement($str);
- echo "<pre>";
- print_r($xml);
目前看来,这种解决方法比较好。
Tags: php, simplexml, xml, namespace
PHP | 评论:1
| 阅读:23424
Submitted by gouki on 2010, December 4, 11:48 AM
在转这篇文章之前,我先说一点项目中遇到的问题,公司的主页最近改版上线,但是上线后出了一点问题,是CSS方面的问题。
CSS文件很多,前端把它分的很细,每一个小的widget部位就是一个单独的CSS文件,这样确实方便了有重复内容时的工作量减轻。于是我们在上线后,对CSS文件进行了合并,用的是Yii的插件 EclientScript(@hightman开发的一个插件)。CSS和JS都顺利合并了,但结果却不太正常。经过仔细检查发现是每个文件头的@charset=utf-8导致了这个问题。合并后,所有的文件内容都被引用到一起,所以造成了合并后的文件中“@charset=utf8”有好几个,但是为了保证文件是按utf-8格式被加载于是保留了最上面的@charset=utf8,其余的都删除了。OK,这时候所有的流量器都正常了。
结果第二天,老板过来说,在IPAD下不正常,于是继续排查,最终发现还是这个@charset=utf8的原因。前面说过,我们只保留了第一个文件的UTF8的判断,其他的都清空了,那为什么还会出错呢?经过测试,发现@charset=utf-8只能在第一行才有效,在其他行时,safari不认,而EClientScript在压缩文件后,会在文件第一行加上这个文件对应实际文件的地址,于是就让@charset=utf8到了第二行。所以IPAD上面显示就不太正常了。。
接下来就转载了:CSS通用元素选择器的都市流言,原文来自:http://shawphy.com/2010/11/css-universal-selector.html
本文尚未有测试数据支持,以下结论仅是根据现有情况的一种解释。
关于 * 这个选择器,一直有个疑惑,到底是否影响效率。在先前的观念中,这由于要匹配所有的元素,让每一个元素都带上这个属性,所以会影响页面的效率。但近来的思考,觉得这应该不会影响效率。为此还特地写过一篇博文,里边提到了这点:真的还需要reset.css么?
而这篇文章中我打算着重阐述为何 * 这个选择器不会影响效率。
上周六去参加了 web标准化交流会,席间 winter 从浏览器(webkit)的角度分享了关于页面渲染的过程。其PPT也可以在前面的链接中下载到。
其中一个很重要的过程是,当页面载入过程中,CSS 和 HTML 是并行下载的。并且通常CSS是在HEAD中引入的,并且体积不如HTML大,所以CSS会先下载完。下载的过程中浏览器就已经开始对CSS中的规则进行 索引,也就是已经确定哪一个元素呈现的样式是如何的了。同时,浏览器根据HTML构建出的DOM树,其中的每一个元素会直接去CSS规则索引中去比对,构 建出渲染树。这个过程都是并行的,并且CSS规则是进行了索引的,因此速度非常的快速。
那么我们看看CSS规则的来源主要有2个,一是浏览器内置的元素样式,Firefox 3.x版是放在目录下的res文件夹内,4.0版和Chrome中没找到(这里是我的主观臆断不太可靠,大家自行辨别),另一个就是页面提供的。根据查看 放在 res 文件夹下的 CSS 文件就可以得知,就是是什么样式都不写,已经为每一个HTML元素设定好了基本样式了。
那么看看我们所忌讳的事情,不用*{margin:0;padding:0},而是使用
CSS代码
- html, body, div, span, applet, object, iframe,
- h1, h2, h3, h4, h5, h6, p, blockquote, pre,
- a, abbr, acronym, address, big, cite, code,
- del, dfn, em, font, img, ins, kbd, q, s, samp,
- small, strike, strong, sub, sup, tt, var,
- b, u, i, center,
- dl, dt, dd, ol, ul, li,
- fieldset, form, label, legend,
- table, caption, tbody, tfoot, thead, tr, th, td {
- margin: 0;
- padding: 0;
- }
看看这一大坨东西啊,难道不是跟上面的 * 选择器一个用途么?对每个元素(至少是常用元素),添加样式。其实作用是一样的,并且就算没有这一坨,浏览器内置样式也在对每个元素设置样式。之后 HTML 文件中的每一个元素,可以很容易找到自己应当呈现的样式了。
那么,对于之后添加的,会不会有性能影响呢?也不会,由于CSS规则已经确定并索引了,所以今后增加的元素也不过就是简单比对一下而已,不会多走一步的。
所以,由此得出结论,只要有需要,大胆的使用 * 吧,他不会给你从性能上增加额外的麻烦。
最后补两个前端优化小知识:
1,由于CSS规则和HTML是并行载入的,因此把CSS放在HEAD中是非常有必要的。
2,少使用 :last-child 。因为这个选择器无法索引起来,必须等DOM构件完,才能知道他是不是父元素中最后的那个 元素。这种就非常慢了,慎用。
----EOF--
注:文中@charset=utf-8我格式可能写的不对,只是表达一个意思,因为我没有dreamwaver,而所说DW在写CSS的时候,默认会在第一行加上这个玩意。。。
Tags: css, charset, eclientscript, yii
PHP | 评论:0
| 阅读:18021
Submitted by gouki on 2010, December 2, 9:50 AM
有朋友在sinaapp上开了个项目,是快盘提取文件,支持任意后缀名,因为这样就可以方便用户转贴到任意勃客或者论坛之类的了
所以我也就写了一个类似的。。还没有做rewrite。。
可以尝试一下:
http://labs.neatstudio.com/115.php?code=t99f5a9181&type=
这个type可以是tel,cnc,union,udan,对应了电信,网通,联通,优蛋(优蛋只能生成链接并帮你触发点击)
如果网上啥数据也没有,那就只能生成U蛋链接喽。
想法创意来自:http://kill.sinaapp.com/
Tags: 115
PHP | 评论:1
| 阅读:15648
Submitted by gouki on 2010, November 7, 10:28 PM
这,应该算是冯大辉的牢骚吧?事实上我们也都知道,IE6真的不靠谱,不给力,但。。。有时候真的不能不用。
冯大辉这么说,从国内 IE 6 的市场份额说开去,
网络大战,眼球无数,口水横飞,最受伤的仍然是那些可怜的用户。刚才偶然想到另一个和大战中的各方有点关系的话题:IE 6 浏览器在中国市场份额为何仍然高居不下?
作为一个十余年前发布的软件产品,作为无数互联网行业同仁最头疼的浏览器,无论从哪个方面看,IE 6 都应该推出历史舞台。但是,从各方面数据来看,在国内仍有接近半数的用户在用这个千疮百孔的浏览器,这不是怪事吗? 有知就里的朋友会觉得这不是一个多么复杂的问题,业界同仁都会给出这样一个答案:因为大量定制的盗版 Windows 造成这一局面。这是个关键因素,抛开那个盗版利益链不谈,我们继续提问,为何国内这些安全厂商不协力将这一境况改变?
如果"尊重用户的利益"(refer), 那么自居"卫士"的那个公司应该努力把这事儿解决掉,而不是搞什么"开机速度大比拼"。按理说,这事儿应该很容易,那个软件管家整天给用户提示一些没什么 新功能的"新版本"软件,给用户多提示下升级真的更加安全的 IE 8 应该不难吧? 当然不厌其烦去提示用户升级一下 IE,不推广自己的什么所谓的"安全浏览器"肯定是一件有损自身商业的事情,但这样会真的赢得口碑和尊重。
同样,那个靠 IM 独霸一方的公司,既然为"一天就能扫描出170万个木马"(refer)而担心用户安全的问题,那么帮用户把大门修好,你们是不是也很省心?当然,这样会有损你们自家生产的浏览器市场。但长期来看,那些损失的会弥补回来。
那个国内最大的电子商务公司,那家国内最大的第三方支付企业,与其忙活着开发"自己"(其实也都是用了别人的内核)的浏览器,还不如去协助用户用到更好一点的浏览器,提升用户的安全,自己就会减少麻烦。这不是帮别人,这是在帮助自己。
或许,这些想法都太幼稚了,因为一个有缺陷的浏览器是是一个植入梦境的机会,是生财之道。谁控制浏览器,谁控制 Web 入口;谁控制入口,谁就能源源不断得获取利益。
中国用户之所以 IE 6 的份额高举不下,其实就是和这些利益链条有关系。说白了,IE 6 这个堪称世界上最不安全的浏览器,就好比一个操作系统系统后门,要想在我等可怜的用户的操作系统上来去自如多半要依赖它。如果中国用户统一升级到 IE 最新版本或是其它如 Firefox、Chrome 等浏览器,恐怕很多号称做"安全"产品的公司都要关门大吉,你说,他们能干么?
对于国内的所有网站来说,解决 IE 6 的问题,就是在帮网站提高效率;对于每一个技术人来说,解决 IE 6 的问题,就是提升我们的生产力;对于每一个用户来说,解决 IE 6 的问题,就是给自己一个掌控自身权益的机会。
这才有点"低碳、环保"的意味在里面。
--EOF--
有时候想想是谁在坚持着IE6?难道不又是那些我们认为大型的公司嘛?正是他们养成了那些普通用户的习惯,只是现在又要求他们改掉,但对那些不太熟悉电脑的人来说,这个难度不低啊。我是习惯了firefox了。。不过,最近也准备折腾chrome,因为听说开发插件很方便。而firefox的插件则有点痛苦。。。
PHP | 评论:1
| 阅读:15377
Submitted by gouki on 2010, November 5, 10:14 PM
以前这个开放平台就存在,但一直没有关注过。只是这次好象开始支持PHP了。而且。。。
腾讯社区开放平台是基于QQ空间、朋友社区(QQ校友)两大社交网络的开放平台。至今官方提供了一系列的开放接口(Open API)和开发工具包(SDK),开发者可以通过Open API获取登录用户信息、用户签名信息以及好友关系链信息等。已上线的应用还可以调用支付和监控接口,实现支付功能,查看应用实时运维数据。这句话来自:http://opensns.qq.com/apps/wiki
API接口地址在这里:http://wiki.opensns.qq.com/wiki/SDK%E4%B8%8B%E8%BD%BD#1_PHP_SDK,也可以在此页面下载,文件名中pengyou.class.php,有兴趣的可以看一下。我是下载了,有空的时候折腾折腾。
Tags: qq, tencent, api
PHP | 评论:0
| 阅读:21749