我有一个这样的 XML 文件:
<lib:library>
<lib:book> XML </lib:book>
<lib:book> XPath </lib:book>
<lib:book> XSLT </lib:book>
<lib:book> Java </lib:book>
<lib:book> C++ </lib:book>
</lib:library>
我想去看书 [2]...我当然可以做类似//lib:Book[2] 的事情...而且它有效。可能会发生在同一个 XML 文件中,例如,相同的标签名称但不同的 namespace ;在这种情况下,我的 XPath 表达式不起作用...
我可以替换它:
//*[local-name() = "book"]
此表达式返回 XML 文件中包含的所有书籍...但是如果我想获取数字 [2] 怎么办...我应该如何重写添加有关数字的条件的 XPath 表达式?当然我不想考虑 namespace ,它必须对每个使用的 namespace 都有效。
谢谢 卢卡
最佳答案
当前选择的答案是错误的。
其实//someExpression[2]可以选择很多节点。
例如,如果我们有以下 XML 文档:
<lib:library xmlns:lib="UNDEFINED!!!">
<topic name="XML">
<lib:book> XML </lib:book>
</topic>
<topic name="XPath">
<lib:book> XPath </lib:book>
</topic>
<topic name="XSLT">
<lib:book> XSLT1 </lib:book>
<lib:book> XSLT2 </lib:book>
</topic>
<topic name="Imperative PLs">
<lib:book> Java </lib:book>
<lib:book> C++ </lib:book>
</topic>
</lib:library>
当表达:
//*[local-name() = "book"][2]
根据上面的文档进行评估,选择了两个节点(它们都不是文档中具有所需属性的第二个节点):
<lib:book xmlns:lib="UNDEFINED!!!"> XSLT2 </lib:book>
<lib:book xmlns:lib="UNDEFINED!!!"> C++ </lib:book>
解决方案:在整个文档中选择第 N(比如第 2 个)节点(比如 lib:book)的一种方法是:
(//*[local-name() = "book"])[2]
当在上面的文档上计算这个表达式时,选择了正确的单个节点:
<lib:book xmlns:lib="UNDEFINED!!!"> XPath </lib:book>
说明:如 W3C XPath recommendations中所定义:
//is short for/descendant-or-self::node()/
因此:
//someName[2]
是以下内容的简写:
/descendant-or-self::node()/someName[2]
这会选择文档中名为 someName 且是其父元素的第二个 someName 子元素的任何元素。
换句话说,[] 运算符比 // 伪运算符绑定(bind)更强(具有更高的优先级)。这就是为什么我们需要括号来覆盖默认的运算符优先级。
关于xml - XPath 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7397401/
我正在学习如何使用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
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我使用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)'
@raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://
我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束
我想从then子句中访问case语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案
这是一个例子:s="abcd+subtext@example.com"s.match(/+[^@]*/)Result=>"+subtext"问题是,我不想在其中包含“+”。我希望结果是“潜台词”,没有+ 最佳答案 您可以在正则表达式中使用括号来创建匹配组:s="abcd+subtext@example.com"s=~/\+([^@]*)/&&$1=>"subtext" 关于ruby-正则表达式-排除一个字符,我们在StackOverflow上找到一个类似的问题:
我们有一个字符串:“”这个正则表达式://i如何从当前字符串中获取所有匹配项? 最佳答案 "".scan(//)参见scan在ruby-docs上 关于ruby-如何遍历Ruby中所有正则表达式匹配的字符串?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6857852/