我正在尝试搜索我创建的 XML 文档,但我似乎无法让它正常工作。这是我的 XML 文档...
<?xml version="1.0" encoding="UTF-8"?>
<states>
<repstate location="AL">
<compName>Test Company</compName>
<name>Chris Brown</name>
<address>123 Main St</address>
<city>Anytown</city>
<state>CT</state>
<phone>203-123-4567</phone>
<fax>203-456-7890</fax>
<email>info@email.com</email>
<website>www.testing.com</website>
<serviceArea>All of Alabama</serviceArea>
</repstate>
<repstate location="AK">
<compName>Test Company</compName>
<name>Chris Brown</name>
<address>123 Main St</address>
<city>Anytown</city>
<state>CT</state>
<phone>203-123-4567</phone>
<fax>203-456-7890</fax>
<email>info@email.com</email>
<website>www.testing.com</website>
<serviceArea>All of Alabama</serviceArea>
</repstate>
</states>
这是我要开始工作的代码片段...
<?php
$xml = simplexml_load_file('../../usa.xml');
$found = $xml->xpath("//@location='AK'");
echo $found->state;
?>
它似乎没有正常工作。
我正在尝试加载该节点中的信息。所以所有的公司名称、姓名、地址、城市、州、电话、传真、电子邮件、网站和服务区域。我认为让“状态”工作很容易,但似乎没有任何输出。我做错了什么?
最佳答案
正如 Micheal Kay 在 his answer 中概述的那样,xpath 表达式是有效的。他不知道的是,对于 SimpleXML,这不会导致空结果。
因此,当您尝试从空数组中读取字段时,您会看到一个 fatal error 。您的代码与此类似:
$found = array();
echo $found->state;
它回显一个空字符串(由表达式给出的 NULL 值创建)和一个通知:
Notice: Trying to get property of non-object in ...
如果您还没有看到此通知,请务必在您的开发系统中启用错误消息,请参阅 How to get useful error messages in PHP? 。
如您所见,它工作正常,只是没有提供您所期望的。为了让您自己以更有成效的方式继续这样做,如果您能分享您真正期望的内容,那就太好了。
或者换句话说:正如其他人也回答的那样,您需要决定要查找的内容。
从输出代码:
echo $found->state;
我会说您正在寻找以下 XML 元素:
...
<repstate location="AK">
<compName>Test Company</compName>
<name>Chris Brown</name>
<address>123 Main St</address>
<city>Anytown</city>
<state>CT</state>
...
SimpleXML Xpath 的工作原理如下:
因此,在您的情况下,如果我对您希望获得的要查询的元素的假设是正确的,那么您希望返回单个元素节点的状态子元素的节点值。相应的 PHP 代码将是:
$list = $xml->xpath("//repstate[@location = 'AK']");
list($repstate) = $list + array(null);
$state = $repstate ? $repstate->state : '- no such location -';
echo $state;
您的 XML 的输出将是:
CT
或者更短:
$list = $xml->xpath("//repstate[@location = 'AK']/state");
list($state) = $list + array('- no such location -');
echo $state;
我希望这个更广泛的解释对您有所帮助。您的原始表达式不起作用的原因是它已经违反了第一点:
因为您的 xpath 查询表示一个 bool 表达式而不是一个节点列表。此外,SimpleXMLElement xpath 中的此类列表需要您具有元素或属性,并且不是 bool 表达式。
关于php - 基于属性值定位元素的XPath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32658957/
我正在学习如何使用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
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我使用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
查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用
我正在学习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)'
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵