我正在尝试使用 XPath (Java) 根据以特定值开头的未知属性获取所有未知节点。出于某种原因,它没有返回包含名为 value 的属性的节点.我还在 www.freeformatter.com/xpath-tester.html 测试过并得到相同的结果。这是我所拥有的:
XML:
<div>
<object data="/v1/assets/mp4Video-1" type="video/mp4">
<param name="webmSource" value="/v1/assets/webmVideo-1" type="REF"/>
</object>
</div>
XPath 表达式:
//*[starts-with(@*, '/v1/assets/')]
结果 - 返回 <object> , 但不是 <param> .
现在,如果我将 XPath 表达式更改为 //*[starts-with(@*, '/v1/assets/') or starts-with(@value, '/v1/assets/')] ,它会按预期返回。
我想我的问题是,关于 value 的是什么?导致 XPath 无法将其正确识别为属性的属性,或者在 value 时不返回元素的属性属性包含我要查询的值?
最佳答案
你原来的路径表达式的原因:
//*[starts-with(@*, '/v1/assets/')]
不起作用与 XPath 1.0 中的函数如何处理比预期更多的节点有关。 starts-with() 函数需要一个节点作为它的第一个参数,一个字符串(或计算结果为字符串的节点)作为它的第二个参数。
但是在上面的表达式中,starts-with() 被传递给一个 set 属性节点,@*,作为它的第一个参数.在这种情况下,此函数仅使用这些属性节点中的第一个。集合中的所有其他节点都将被忽略。由于属性的顺序没有在 XML 中定义,XPath 引擎可以自由选择要在函数中使用的任何属性节点。但是您的特定 XPath 引擎(以及许多其他引擎)似乎始终按照出现的顺序使用 first 属性节点。
为了说明(并证明),将您的输入文档更改为
<div>
<object data="other" type="/v1/assets/mp4Video-1">
<param name="/v1/assets/webmVideo-1" value="other" type="REF"/>
</object>
</div>
如您所见,我更改了属性的顺序,包含 /v1/assets/ 的属性现在是 对象的 second 属性 元素,反之亦然 param 元素。使用此输入文档,您的原始 XPath 表达式将仅返回 param 元素。
同样,这种行为在不同的 XPath 引擎之间不一定一致!使用 XPath 的其他实现可能会产生不同的结果。
执行您需要的 XPath 表达式是
//*[@*[starts-with(., '/v1/assets/')]]
用简单的英语,它说
select elements anywhere in the document, but only if, among all attribute nodes of an element, there is an attribute whose value starts with "/v1/assets/".
关于java - XPath - 属性通配符不返回具有名为值的属性的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29526080/
我正在学习如何使用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
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我希望我的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
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我有这个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
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www