我一直在回顾我所有的旧代码并尝试优化它。我最近偶然发现并让我感到困惑的是试图为此找到一个 xpath 解决方案:
function findit($search) {
$i=0;
foreach($xml as $page) { //loop to find specific $element based on $attribute
if($page['src']==$search) { return $i; }
$i++;
}
}
需要返回$i,以便后面引用XML中的元素。
这似乎应该可行,而且我发现了一些 xpath 字符串,它们看起来应该可以工作,但实际上没有。他们通常引用 preceding-children 并通过 xpath() 函数对其进行计数,但我找不到原始来源了,也不知道如何将其翻译成一个 PHP xpath 字符串。
这可能吗?还是比我已经拥有的更好/更快/更有效?建议/解决方案?
编辑:对于 Tandu 的解决方案
我的 XML 文件示例
<range>
<page src="attribute1" />
<page src="attribute2" />
etc...
<page src="attribut20" />
</range>
在我当前的 PHP 函数中,$i 总是返回 0 但应该返回 $search 所在的任何位置。已编辑,因此不再需要转换 simplexml。
function findit($search) {
$dom=new DOMDocument('1.0');
$dom->load($file);
$xpath=new DOMXPath($dom);
$i=$xpath->evaluate("count(/range/page[@src='$search']/preceding-sibling::*)");
die($dom->saveXML());
}
最佳答案
PHP 至少有两种(据我所知)处理 Xpath 的方法:DOMXPath图书馆,与DOMDocument一起工作, 和 SimpleXML ,它有自己的 xpath() 方法。如果您想计算实际表达式(例如在您的示例中获取 i),您必须使用 DOMXPath::evaluate()。 SimpleXML::xpath() 只会返回一个节点列表(DOMXPath::query() 也一样)。在 php 中也有 xpath_ 方法,但这些似乎是其他方法的功能版本,并且仍然需要 DOM 上下文节点对象。
我不确定上面示例中的 xml 是什么,但下面的示例使用了 DOMXPath。据我所知,没有简单的方法可以将 SimpleXML 转换为 DOMDocument。您只需单独加载 xml。
$xml = <<<XML
<root>
<child attribute="one" />
<child attribute="one" />
<child attribute="one" />
<child attribute="one" />
<child attribute="one" />
<child attribute="two" />
<child attribute="one" />
<child attribute="one" />
<child attribute="one" />
<child attribute="one" />
<child attribute="one" />
</root>
XML;
$dom = new DOMDocument;
$dom->loadXML($xml);
//DOMXPath requires DOMDocument in its constructor
$xpath = new DOMXPath($dom);
//evaluate will return types .. we are expecting an int, not a DOMNodeList
//Look for a child node of root named "child" with attribute="two"
//Count all its preceding siblings.
$i = $xpath->evaluate('count(/root/child[@attribute="two"]/preceding-sibling::*)');
关于php - 根据属性查找特定元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7910892/
我希望我的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
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
查看我的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([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决