在回答这个问题时How to read values from XML Request and write into XML Response using Groovy?与 namespace (SOAP) 有关 XmlSlurper和 XmlParser , 我意识到默认情况下我实际上无法判断它们是否非命名空间感知。
虽然文档这样说(默认情况下不识别命名空间):
XmlSlurper ()
Creates a non-validating and non-namespace-aware XmlSlurper which does not allow DOCTYPE declarations in documents.
XmlParser ()
Creates a non-validating and non-namespace-aware XmlParser which does not allow DOCTYPE declarations in documents.
代码恰恰相反(默认命名空间感知):
public XmlSlurper() throws ParserConfigurationException, SAXException {
this(false, true);
}
public XmlParser() throws ParserConfigurationException, SAXException {
this(false, true);
}
我也发现了这个answer声称 XMLSlurper 默认情况下是非 namespace 感知的。
最佳答案
我认为文档是错误的,XmlSlurper 和 XmlParser 默认是 namespace-aware:
def text = '''<person xmlns:city="http://localhost/">
<name>jalopaba</name>
<city:name>Valladolid</city:name>
</person>'''
// XmlSlurper is namespace aware, since new XmlSlurper() --> new XmlSlurper(false, true)
def slurped_person = new XmlSlurper().parseText(text)
assert 'jalopabaValladolid' == slurped_person.name.text() // :name and :name from city
assert 'jalopaba' == slurped_person.':name'.text() // aware of default namespace
assert '' == slurped_person.'city:name'.text() // city namespace not declared
// but you need to make the resulting GPathResult aware of the concrete namespace
slurped_person = new XmlSlurper().parseText(text).declareNamespace([city: 'http://localhost/'])
assert 'jalopabaValladolid' == slurped_person.name.text() // :name and :name from city
assert 'jalopaba' == slurped_person.':name'.text() // aware of default namespace
assert 'Valladolid' == slurped_person.'city:name'.text() // city namespace declared
// If you make XmlSlurper not namespace aware, it uses the whole element string
slurped_person = new XmlSlurper(false, false).parseText(text)
assert 'jalopaba' == slurped_person.name.text() // just element 'name'
assert '' == slurped_person.':name'.text() // not aware of default namespace
assert 'Valladolid' == slurped_person.'city:name'.text() // using the whole element string (it seems to be namespace aware, but it's not)
// And when it is not namespace aware, nothing changes declaring namespaces
slurped_person = new XmlSlurper(false, false).parseText(text).declareNamespace([city: 'http://localhost/'])
assert 'jalopaba' == slurped_person.name.text() // just element 'name'
assert '' == slurped_person.':name'.text() // not aware of default namespace
assert 'Valladolid' == slurped_person.'city:name'.text() // using the whole element string (it seems to be namespace aware, but it's not)
def c = new Namespace('http://localhost/', 'city')
assert c.name instanceof QName // => new QName('http://localhost/', 'name', 'city')
// XmlParser is namespace aware, since new XmlParser() --> new XmlParser(false, true)
def parsed_person = new XmlParser().parseText(text)
assert parsed_person.toString() == 'person[attributes={}; value=[name[attributes={}; value=[jalopaba]], {http://localhost/}name[attributes={}; value=[Valladolid]]]]'
assert 'jalopaba' == parsed_person.name.text() // default namespace
assert 'jalopaba' == parsed_person[new QName('name')].text() // default namespace
assert 'jalopabaValladolid' == parsed_person[new QName('http://localhost/', 'name')].text() // aware of namespace and empty string as prefix
assert 'Valladolid' == parsed_person[new QName('http://localhost/', 'name', 'it_does_not_matter')].text() // aware of namespace, prefix does not matter
assert '' == parsed_person[new QName('http://wrong_namespace/', 'name', 'city')].text() // aware of namespace, wrong URI with good prefix gets nothing
assert 'Valladolid' == parsed_person[c.name].text()
assert 'Valladolid' == parsed_person.'city:name'.text() // using the whole element string
// With XmlParser not namespace aware...
parsed_person = new XmlParser(false, false).parseText(text)
assert parsed_person.toString() == 'person[attributes={xmlns:city=http://localhost/}; value=[name[attributes={}; value=[jalopaba]], city:name[attributes={}; value=[Valladolid]]]]'
assert 'jalopaba' == parsed_person.name.text()
assert 'jalopaba' == parsed_person[new QName('name')].text()
assert 'jalopaba' == parsed_person[new QName('http://localhost/', 'name')].text() // ignores namespace, only uses 'name' string
assert '' == parsed_person[new QName('http://localhost/', 'name', 'wrong_prefix')].text() // not aware of namespace, the only important thing is prefix
assert 'Valladolid' == parsed_person[new QName('http://wrong_namespace/', 'name', 'city')].text() // wrong namespace but not aware, the only important thing is prefix
assert 'Valladolid' == parsed_person[c.name].text()
assert 'Valladolid' == parsed_person.'city:name'.text()
关于xml - 默认情况下 XmlParser 和 XmlSlurper 命名空间是否感知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33418826/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba