我正在尝试使用 JSTL 解析以下 XML。除了带有“t”前缀的标签之外,我可以轻松地检索 XML 中的所有元素,我该怎么做?
XML 看起来像 (feed.xml)
<rss version="2.0" xmlns:t="http://www.xxx.co.uk/xxx">
<channel>
<title></title>
<link></link>
<description></description>
<language>en-uk</language>
<copyright></copyright>
<webMaster></webMaster>
<pubDate>Thu, 02 Sep 2010 16:56:49 +0100</pubDate>
<lastBuildDate>Thu, 02 Sep 2010 17:24:03 +0100</lastBuildDate>
<ttl></ttl>
<image>
<title></title>
<link></link>
<width></width>
<height></height>
<url></url>
</image>
<category></category>
<item>
<title>Title text 1</title>
<link>http://a.b.com/link1</link>
<description>Description text 1</description>
<enclosure url="http://a.b.com/xxxx/yyyy1.jpg" length="999" type="image/jpeg" />
<guid>Unique-identifier-1</guid>
<test>
<test1>azman</test1>
</test>
<t:fields>
<t:isfeatured>true</t:isfeatured>
</t:fields>
</item>
</channel>
我的 JSTL 看起来像这样
<c:import url="feed.xml" var="xml"/><x:parse xml="${xml}" var="doc"/>
下面会返回“Title text 1”
<x:out select="$doc/rss/channel/item/title" />
但是下面会出现下面的错误
<x:out select="$doc/rss/channel/item/t:fields/t:isfeatured" />
堆栈跟踪: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:401) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 根本原因
javax.servlet.ServletException:javax.servlet.jsp.JspTagException:评估 XPath 表达式“/rss/channel/item/t:fields/t:isfeatured”时出错:javax.xml.transform.TransformerException:前缀必须解析为命名空间:t org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:858) org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791) org.apache.jsp.index_jsp._jspService(index_jsp.java:106) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 根本原因
javax.xml.transform.TransformerException:前缀必须解析为命名空间:t org.apache.xpath.compiler.XPathParser.error(XPathParser.java:640) org.apache.xpath.compiler.Lexer.mapNSTokens(Lexer.java:676) org.apache.xpath.compiler.Lexer.tokenize(Lexer.java:303) org.apache.xpath.compiler.Lexer.tokenize(Lexer.java:134) org.apache.xpath.compiler.XPathParser.initXPath(XPathParser.java:146) org.apache.xpath.XPath.(XPath.java:200) org.apache.taglibs.standard.tag.common.xml.JSTLXPathAPI.eval(JSTLXPathAPI.java:285) org.apache.taglibs.standard.tag.common.xml.XPathUtil.valueOf(XPathUtil.java:472) org.apache.taglibs.standard.tag.common.xml.ExprSupport.doStartTag(ExprSupport.java:64) org.apache.jsp.index_jsp._jspx_meth_x_005fout_005f0(index_jsp.java:173) org.apache.jsp.index_jsp._jspService(index_jsp.java:91) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
感谢您的帮助!
最佳答案
看起来虽然您的文档指定了 namespace 声明,但从 JSTL 代码调用的 XPath 引擎并不知道 namespace ,对于 Xalan, namespace 上下文中提供了 namespace 。我不了解 JSTL,但您可能会研究如何为 JSTL 设置命名空间上下文。
我用谷歌搜索了 jSTL xpath namespace context 并得到了一个 interesting hit ,不幸的是,它不包含解决方案。
编辑:看起来您只能使用 namespace-uri() 函数在 JSTL 1.0 中执行此操作,从而导致长而难以阅读的 XPath 表达式。参见 here
关于xml - JSTL - 解析不适用于具有命名空间的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3898512/
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
当我在我的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
简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und