我正在使用 Retrofit 2.1.0 和 Retrofit SimpleXML Converter 2.1.0。我使用 addConverterFactory 方法添加了 simplexmlconverter 来改造实例。
XML 在下面
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
<channel>
<title>title</title>
<description></description>
<language>en-us</language>
<item>
<title>text</title>
<link>text</link>
<description>text</description>
<enclosure url="text" length="2043520" type="image/jpeg" />
<guid isPermaLink="false">text</guid>
<pubDate>Fri, 17 Jun 2016 11:43 EDT</pubDate>
<source url="text">text</source>
</item>
<item>
<title>text</title>
<link>text</link>
<description>text</description>
<enclosure url="text" length="1735257" type="image/jpeg" />
<guid isPermaLink="false">text</guid>
<pubDate>Thu, 16 Jun 2016 10:17 EDT</pubDate>
<source url="text"></source>
</item>
<item>
<title>text</title>
<link>text</link>
<description>text</description>
<enclosure url="text" length="3763157" type="image/jpeg" />
<guid isPermaLink="false">text</guid>
<pubDate>Wed, 15 Jun 2016 10:02 EDT</pubDate>
<source url="text">text</source>
</item>
</channel>
</rss>
我的改造api客户端相关代码:RetrofitAPIClient
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(SimpleXmlConverterFactory.create())
.build();
apiService = retrofit.create(MyService.class);
ArticleResponse.java
import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
import java.util.List;
@Root(name = "rss")
public class ArticleResponse {
@Element(name = "channel")
public Channel channel;
public class Channel {
@ElementList
public List<Article> articles;
}
}
文章.java
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Text;
@Element(name = "item")
public class Article {
@Element(name = "title")
private String title;
@Element(name = "link")
private String link;
@Element(name = "description")
private String description;
@Element(name = "enclosure")
private Enclosure enclosure;
@Element(name = "guid")
private String guid;
@Element(name = "pubDate")
private String pubDate;
@Element(name = "source")
private Source source;
public class Enclosure {
@Attribute(name = "url")
private String url;
@Attribute(name = "length")
private long length;
@Attribute(name = "type")
private String type;
}
public class Source {
@Attribute(name = "url")
private String url;
@Text
private String text;
}
}
错误是:
06-18 20:31:22.894 W/System.err: java.lang.RuntimeException: org.simpleframework.xml.core.AttributeException: Attribute 'version' does not have a match in class [my-package].webservice.response.ArticleResponse at line 1
06-18 20:31:22.894 W/System.err: at retrofit2.converter.simplexml.SimpleXmlResponseBodyConverter.convert(SimpleXmlResponseBodyConverter.java:44)
06-18 20:31:22.894 W/System.err: at retrofit2.converter.simplexml.SimpleXmlResponseBodyConverter.convert(SimpleXmlResponseBodyConverter.java:23)
06-18 20:31:22.894 W/System.err: at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:116)
06-18 20:31:22.894 W/System.err: at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211)
06-18 20:31:22.894 W/System.err: at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:106)
06-18 20:31:22.894 W/System.err: at okhttp3.RealCall$AsyncCall.execute(RealCall.java:133)
06-18 20:31:22.894 W/System.err: at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
06-18 20:31:22.894 W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
06-18 20:31:22.894 W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
06-18 20:31:22.894 W/System.err: at java.lang.Thread.run(Thread.java:818)
06-18 20:31:22.894 W/System.err: Caused by: org.simpleframework.xml.core.AttributeException: Attribute 'version' does not have a match in class [my-package].webservice.response.ArticleResponse at line 1
06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Composite.readAttribute(Composite.java:494)
06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Composite.readAttributes(Composite.java:413)
06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Composite.access$300(Composite.java:59)
06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Composite$Builder.read(Composite.java:1382)
06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Composite.read(Composite.java:201)
06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Composite.read(Composite.java:148)
06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Traverser.read(Traverser.java:92)
06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Persister.read(Persister.java:625)
06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Persister.read(Persister.java:606)
06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Persister.read(Persister.java:584)
06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Persister.read(Persister.java:543)
06-18 20:31:22.895 W/System.err: at retrofit2.converter.simplexml.SimpleXmlResponseBodyConverter.convert(SimpleXmlResponseBodyConverter.java:36)
06-18 20:31:22.895 W/System.err: ... 9 more
最佳答案
尝试使用 strict = false :
@Root(name = "rss", strict = false)
public class ArticleResponse {
@Element(name = "channel")
public Channel channel;
public class Channel {
@ElementList
public List<Article> articles;
}
}
关于Android Retrofit 2 简单 XML 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37899858/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。