我正在使用Simple XML生成RSS Google Merchant.

Google提供的示例是:

<?xml version="1.0"?>
<RSS version="2.0" 
xmlns:g="http://base.google.com/ns/1.0">
<channel>
<title>The name of your data Feed</title>
<link>http://www.example.com</link>
<description>A description of your content</description>
<item>
<title>Red wool sweater</title>
<link> http://www.example.com/item1-info-page.html</link>
<description>Comfortable and soft,this sweater will keep you warm on those cold winter nights.</description>
<g:image_link>http://www.example.com/image1.jpg</g:image_link> <g:price>25</g:price> <g:condition>new</g:condition> <g:id>1a</g:id>
</item>
</channel>
</RSS>

我的代码有:

$product->addChild("g:condition",'new');

哪个产生:

<condition>new</condition>

我在线阅读我应该改用:

$product->addChild("g:condition",'new','http://base.google.com/ns/1.0');

现在生成的

<g:condition xmlns:g="http://base.google.com/ns/1.0">new</g:condition>

这似乎对我来说是非常反直觉的,因为现在的“xmlns”声明几乎是我的RSS Feed中几乎每一行在根元素中的一次.

我错过了什么吗?

@ceejayoz表示,您需要将“http://base.google.com/ns/1.0”命名空间添加到根节点,以便SimpleXML知道命名空间已经被声明,并且不会发出重复的前缀绑定.

我想你可能需要阅读tutorial on XML Namespaces,因为我不确定你真的明白“g:”在这里做什么.

这是一个更完整的例子.
XML:

$xml = <<<EOT 
<?xml version="1.0"?> 
<RSS version="2.0" xmlns:g="http://base.google.com/ns/1.0"> 
  <channel> 
    <title>The name of your data Feed</title> 
    <link>http://www.example.com</link> 
    <description>A description of your content</description> 
    <item> 
      <title>Red wool sweater</title> 
      <link> http://www.example.com/item1-info-page.html</link> 
      <description>Comfortable and soft,this sweater will keep you warm on those cold winter nights.</description> 
      <g:image_link>http://www.example.com/image1.jpg</g:image_link> 
      <g:price>25</g:price> 
      <g:id>1a</g:id> 
    </item> 
  </channel> 
</RSS> 
EOT 
;

码:

$RSS = new SimpleXMLElement($xml); 
$NS = array( 
    'g' => 'http://base.google.com/ns/1.0' 
); 
$RSS->registerXPathNamespace('g',$NS['g']); 
$product = $RSS->channel->item[0]; // example 

// Use the complete namespace. 
// Don't add "g" prefix to element name--what prefix will be used is 
// something SimpleXML takes care of. 
$product->addChild('condition',$NS['g']); 

echo $RSS->asXML();

我通常使用这种模式轻松处理命名空间:

$RSS = new SimpleXMLElement($xml); 
$NS = array( 
    'g' => 'http://base.google.com/ns/1.0' 
    // whatever other namespaces you want 
); 
// Now register them all in the root 
foreach ($NS as $prefix => $name) { 
    $RSS->registerXPathNamespace($prefix,$name); 
} 
// Then turn $NS to an object for more convenient Syntax 
$NS = (object) $NS; 
// If I need the namespace name later,I access like so: 
$element->addChild('localName','Value',$NS->g);

PHP的SimpleXML:如何在名字中使用冒号的更多相关文章

  1. ios – 在Swift 3转换之后,我无法摆脱错误:“不明确地使用’indexOfObject(passingTest :)’”

    )这样的简单调用变得模棱两可.它可能在呼唤>indicesOfObjects(passingTest版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  2. swift注意点

    如果我们想要像Objective-C里那样定义可选的接口方法,就需要将接口本身定义为Objective-C的,也即在protocol定义之前加上@objc。另外和Objective-C中的@optional不同,我们使用没有@符号的关键字optional来定义可选方法//swift中的错误处理,Objective-C没有原生的异常处理机制。后来通过添加NSException类,还有NS_DURING,NS_HANDLER和NS_ENDHANDLER宏才有了异常处理。这种方案现在被称为“经典的异常处理”,还

  3. Swift:Foundation框架中的NS前缀的由来

    可能大家对于著名的NS前缀的由来有一些疑问.绝大多数这些NS前缀的类是NeXTSTEP操作系统中Foundation框架里的一部分,而该操作系统是OSX的基础.NeXTSTEP的程序员对它们的类和函数使用NX前缀.这个前缀在NeXT和Sun合作创建OpenStep之后被改为NS,OpenStep是一个面向对象的框架,它用来在其他平台上提供类似于NeXTSTEP的环境.所以,取决于你向谁提出这个问题,一些人会说NS指的是NeXTSTEP,而另一些人会说NS指的是NeXT/Sun.;]

  4. swift – 使用未声明的类型’AttributedString’

    Xcode8beta4不再识别Foundation类的AttributedString.我在这个简单的游乐场示例中重现了它:由于AttributedString在较旧的Xcode8Swift3测试版中可用,我想这是一个需要修复的基础bug,而不是Playground中的一些源代码错误?

  5. Swift 3:日期vs NSDate?

    NS和非NS类有什么区别?NS代表核心非NS功能的某种类型的包装器?

  6. JSP由浅入深(10)—— Beans and Forms处理

    表单是在网站交互的一个很普通的方法。JSP使表单处理更加简单。在JSP中处理表单的标准方法是定义一个“bean”。这个“bean”不是一个完全的Javabean。这个类区域必须有“setters”来匹配表单区域的名字。具体代码修改如下:What'syourname?区域名字的第一个字母要用大写的。所以如果区域为“email”,它的“setter”方法就为“setEmail”。同样的,“Getter”方法也类

  7. JSP教程(五)-JSP Actions的使用下

    BeanTest.jspReusingJavaBeansinJSPReusingJavaBeansinJSP

  8. JSP教程(四)-JSP Actions的使用

    JSPactions使用您可以动态的插入一个文件,重用JavaBeans组件,前进到另一个页面,或为Java插件生成一个HTML。可以使用的action有:jsp:include--在页面被请求时包含进一个文件。每一次当标题改变的时候,您仅需修改这四个文件而无须更改主要的JSP页面。

  9. JSP由浅入深(9)—— JSP Sessions

    为了这个目的,我们可以使用JSP中的"sessions"。Session为不同的用户保存了不同了数据。以下的网页将用户的名字放置于session中,并可以在其它地方来显示它。这个表单的目标是“SaveName.jsp”,它在session保存了用户的名字。

  10. PHP - Html Transfer Code

    超文本转换码,市面上这东西已经很滥(多)了,不过是这几天自己实践了一下~~~~支持多重嵌套和同标签嵌套,混合高亮显示自我感觉便于修改和扩充~~~~~~~~~~~

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部