我无法弄清楚是 XPath 本身应该受到指责,还是特定的 XPath 实现让这变得如此困难。 SO 问题 – How to change an an XML element in a namespace with MSDeploy Parameters.xml file? – 是我的灵感。
这是不起作用的基本示例。
XML:
<spring>
<objects xmlns="http://www.springframework.net">
<object id="CultureResolver" type="Spring.Globalization.Resolvers.SessionCultureResolver, Spring.Web">
<!--configure for server-->
<property name="DefaultCulture" value="en" />
</object>
</objects>
</spring>
XPath:
//spring/objects/object[@id='CultureResolver']/@type
XPath 查询不返回任何内容,而是:
Spring.Globalization.Resolvers.SessionCultureResolver, Spring.Web
我会,也许天真地,期望下面的工作。
修改后的 XML:
<spring>
<spring:objects xmlns:spring="http://www.springframework.net">
<spring:object id="CultureResolver" type="Spring.Globalization.Resolvers.SessionCultureResolver, Spring.Web">
<!--configure for server-->
<spring:property name="DefaultCulture" value="en" />
</spring:object>
</spring:objects>
</spring>
修改后的 XPath 查询:
//spring/spring:objects/spring:object[@id='CultureResolver']/@type
此查询在 the online tester 中引发错误我用过:
ERROR - Failed to evaluate XPath expression: org.apache.xpath.domapi.XPathStylesheetDOM3Exception: Prefix must resolve to a namespace: spring
修改后的 XML:
<spring xmlns="" xmlns:spring="http://www.springframework.net">
<spring:objects>
<spring:object id="CultureResolver" type="Spring.Globalization.Resolvers.SessionCultureResolver, Spring.Web">
<!--configure for server-->
<spring:property name="DefaultCulture" value="en" />
</spring:object>
</spring:objects>
</spring>
修改后的 XPath 查询(与 What I Expect to Work 相同):
//spring/spring:objects/spring:object[@id='CultureResolver']/@type
更加困惑的是,我发现以下 XPath 查询适用于原始示例 XML(在在线测试器 XPath 引擎中):
//spring/*[local-name() = 'objects' and namespace-uri() = 'http://www.springframework.net']/*[@id='CultureResolver' and local-name() = 'object' and namespace-uri() = 'http://www.springframework.net']/@type
这是否因为 namespace 和前缀之间的相互作用而造成混淆?似乎声明一个没有前缀的命名空间不仅包括该命名空间中的相关元素,而且还包括它的所有子元素,因此将其描述为“默认命名空间”(如相关问题的 this answer)。而使用前缀声明命名空间甚至不包括该命名空间中的相关元素!
为什么 namespace 需要包含在 XML 文档的根元素中,而不依赖于特定的 XPath 实现,有什么原因吗?
我试图解决的问题涉及 Microsoft Web 部署 (MSDeploy) 使用的任何 XPath 引擎。
我也在用 this online XPath tester .
最佳答案
一个有趣且问得很好的问题!据我所知,困难在于您的 XPath 引擎处理输入文档中的命名空间声明的方式。
简短的回答
不,此行为与一般的 XPath 或 XPath 规范无关。这是由于个别实现。
规范说明
就 XML 和 XPath 规范而言,可以在任何元素上声明 namespace ,最外层(或“根”)元素没有什么特别之处。根元素上的命名空间声明与任何其他声明一样。
当然还是有规定的。例如,前缀必须与使用其 QName 的元素或该元素(或该属性)的祖先上的命名空间 URI 相关联。因此,以下不是格式正确的 XML:
<prefix:root>
<child xmlns:prefix="www.example.com"/>
</prefix:root>
第二条重要规则:默认命名空间 只能应用于声明它的元素和所有后代元素。在以下文档中,root 元素根本不在命名空间中:
<root>
<child xmlns="www.example.com">
<grandchild/>
</child>
</root>
我说的规范是 XML , XML Namespaces和 Xpath规范。
在您的 XPath 实现中会发生什么
现在,如果针对 XML 文档评估 XPath 表达式,则此输入文档中存在的所有 namespace 声明也必须显式地提供(声明或“注册”)给 XPath 引擎。
一些 XPath 实现通过简单地重新声明元素或属性范围内的所有命名空间声明来简化这一点,该 XML 文档用作 Xpath 引擎的输入(另请参阅 this) .
在您的情况下,似乎只考虑对最外层元素所做的声明。这就是为什么您的最后一个 XML 文档:
<spring xmlns="" xmlns:spring="http://www.springframework.net">
<spring:objects>
<spring:object id="CultureResolver" type="Spring.Globalization.Resolvers.SessionCultureResolver, Spring.Web">
<!--configure for server-->
<spring:property name="DefaultCulture" value="en" />
</spring:object>
</spring:objects>
</spring>
有效 - 因为命名空间声明是在根元素上进行的,并且您从根元素执行 XPath 表达式。不过,您可以省略默认命名空间的未声明,因为它没有任何效果。
最后,回答你最后一个问题:
Is there some reason why namespaces need to be included in the root element of the XML document, independent of particular XPath implementations?
不,没有理由将 namespace 声明放在根元素上,除了
如果您的 XPath 实现自动重新声明范围内的命名空间声明,您当然可以利用它,但正如您所注意到的,它有时也会造成混淆。
关于xml - 是否需要在根元素中声明 XML namespace 才能被 XPath 查询匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28118400/
我正在学习如何使用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
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我有一个对象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
如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121