我使用下面的代码解析一个XML文件,没问题:
foreach ($xml->product as $products) {
$title = $products->name; etc etc
但是,由于 XML 的结构,我必须在我需要确保它返回正确数据的节点之一上使用 xpath
$actors = $xml->xpath("//property[name[. ='Actors']]/value");
$actor = $actors[0];
这很好用,但它总是返回 XML 文件的第一条记录,我需要它来跟上循环,如果这有意义的话。
我尝试了以下但同样的事情发生了:
$actors = $products->xpath("//property[name[. ='Actors']]/value");
这是有问题的 xml,但是我上面的示例使用了一个名为 name 的节点,它具有数据 Actors,将其交换为 Format,您的想法与下面的节点相同
<name>Format</name>
<properties>
<group>
<name>Product</name>
<property>
<id>48546006</id>
<name>Product name</name>
<value>JOLLY PHONICS (JOLLY PHONICS S.)</value>
</property>
</group>
<group>
<name>Product properties</name>
<property>
<id>43560296</id>
<name>Product Title</name>
<value>JOLLY PHONICS (JOLLY PHONICS S.)</value>
</property>
<property>
<id>43560292</id>
<name>Format</name>
<value>DVD</value>
</property>
</group>
</properties>
这是我正在使用的完整 foreach 循环(我省略了其中的一些,因为您不需要阅读多个内容,它们都可以正常工作,正如您将看到的那样:
foreach ($xml->product as $products) { // AA
$title = $products->name;
$PRid = $products->id;
$actors = $xml->xpath("//property[./name[.='Actors']]/value[next()]"); // this ok but repeats
$actors = $actors[0];
$genre = $xml->xpath("//property[name[. ='Genre']]/value");
$genre = $genre[0];
$prodcat = $products->{'category'};
$addline = mysql_query("
insert into dbname(
blah blah
)
VALUES (
blah blah
) ON DUPLICATE KEY UPDATE lowprice='$lowprice', highprice='$highprice'",$db);
if(!$addline) { echo "cannot add to table here".mysql_error(); exit; } // debug
foreach ($xml->product->retailer as $retailer) { // BB
this is another foreach loop but works perfectly
} // close BB
} // close AA
所以,问题是——我在 XML 文件中有需要提取的节点,它们总是在名为属性的节点中,但是,我不能简单地使用例如name[2] 因为它们有时在不同的地方 - 因此建议我使用 xpath 从我需要的特定节点获取数据,因为它更精确 - 问题是它工作正常但由于某种原因不会只需从当前节点获取数据,但是我尝试 ./或 .//,它总是从第一个节点返回数据。
有什么想法吗?
最佳答案
正如我所怀疑的(在您发布 PHP 代码之前)。您不在循环体中使用相对路径。当然,这总是会产生相同(即绝对)的结果。
您必须使用您的 XPath 引用 $product(而不是 $xml)并从那里使用相对路径,如下所示:
foreach ($xml->product as $product) { // AA
$title = $product->name;
$PRid = $product->id;
$actors = $product->xpath(".//property[name='Actors']/value");
$genre = $product->xpath(".//property[name='Genre']/value");
$prodcat = $product->{'category'};
$addline = mysql_query("
insert into dbname(
blah blah
)
VALUES (
blah blah
) ON DUPLICATE KEY UPDATE lowprice='$lowprice', highprice='$highprice'", $db
);
if(!$addline) {
echo "cannot add to table here".mysql_error(); exit; // debug
}
foreach ($xml->product->retailer as $retailer) { // BB
this is another foreach loop but works perfectly
} // close BB
} // close AA
PS:您真的想在 AA 循环内运行 BB 循环吗(或者您实际上是想在此处循环遍历 $product->retailer)?
关于php - foreach循环内的xpath重复相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7687851/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
让多条路线去同一条路的最优雅的方式是什么ControllerAction?我有:get'dashboard',to:'dashboard#index'get'dashboard/pending',to:'dashboard#index'get'dashboard/live',to:'dashboard#index'get'dashboard/sold',to:'dashboard#index'这很丑陋。有什么“更优雅”的建议吗?一个类轮的奖励积分。 最佳答案 为什么不只有一个路由和一个Controller操作,并根据传递给它的参数来