- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在URL中有一个XML文件,可以在其中解析数据并从XML文件获取图像。但是我不知道如何在其他视图控制器中使用图像。我有一个将图像存储在数组中的想法,但是如何在其他视图控制器中使用图像数组。是否可以将XML解析的图像存储在array中。我是否正确解析XML?请给我一个主意。
我的XML分析器
//egsBase.h
#import <Foundation/Foundation.h>
@interface egsBase : NSObject{
IBOutlet UIImage *img;
}
@property(nonatomic,retain) IBOutlet UIImage *img;
@end
//egsBase.m
#import "egsBase.h"
@implementation egsBase
@synthesize img;
@end
//egsXMLParser.h
#import <Foundation/Foundation.h>
#import "egsBase.h"
@interface egsXMLParser : NSObject <NSXMLParserDelegate>{
NSMutableString *currentNodeContent;
NSMutableArray *tweets;
NSXMLParser *parser;
egsBase *currentTweet;
}
@property(nonatomic,readonly) NSMutableArray *tweets;
-(id) loadXMLByURL:(NSString *) urlString;
@end
//egsXMLParser.m
#import "egsXMLParser.h"
@implementation egsXMLParser
@synthesize tweets;
-(id) loadXMLByURL:(NSString *)urlString{
tweets = [[NSMutableArray alloc] init];
NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];
return self;
}
-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
if([elementName isEqualToString:@"Products"]){
currentTweet = [egsBase alloc];
}
}
-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if([elementName isEqualToString:@"img"])
{
currentTweet.img=[UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString:currentNodeContent]]]; [tweets addObject:currentTweet.img];
}
}
- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
@end
最佳答案
您解析正确吗?有很多问题,有些是实质性的,有些是风格上的。首先,一些实质性观察:
foundCharacters
假定每个元素仅被调用一次。对于通常是真实的URL之类的东西,但您不能保证这一事实。它应该只是将字符附加到字符串,最后字符串的后续存储和清除应在didEndElement
中进行。 foundCharacter
也会存储结果。仅当您在所关注元素名称的foundCharacter
和didStartElement
之间时,才存储didEndElement
的结果。 didStartElement
正在执行alloc
,但也没有在执行init
。您应该始终同时执行init
。您也可以稍后进行其他属性设置,但不要忽略调用适当的init
方法。 didEndElement
正在从服务器检索图像。您确实应该将数据检索限制为仅XML本身(例如,对于图像,为图像的URL),而不要从服务器中检索其他项。当您考虑使用更复杂的设计时,这一点尤其重要,在这种设计中,为了最大程度地减少内存占用并改善用户响应时间,您可能希望采用图像的延迟加载,这意味着您只想从XML中检索URL,并让UI处理是否以及何时检索图像。当您将来开始进行更复杂的开发时,您会后悔在这里进行图像检索。 elementName
和didStartElement
中执行的didEndElement
检查之间不平衡。对于要检索其数据的所有元素,应该平衡调用。我知道您给我们提供了一个示例,出于简单起见,您仅从XML检索单个元素,但是在下面的示例中,我假定我们正在检索两个元素,而平衡这些元素的重要性将变得显而易见。 EGSBase
和EGSParser
。顺便说一下,我不太喜欢EGSBase
,因为它是一个旨在捕获特定类型的XML数据的类,但是具有通用名称。要么使用像NSMutableDictionary
这样的通用数据结构,要么使用一个自定义类并为其赋予一个有意义的名称(例如,基于您对“产品”的引用,我假设这是一个产品,因此我在我中将其重命名为EGSProduct
)下面的示例。)可以随意调用它,但是如果您使用有意义的属性名称,请给它一个有意义的名称。 img
中将egsBase
定义为IBOutlet
,但是我发现您真的不可能将它链接到Interface Builder中的任何东西。首先,它甚至不是UIView
的后代(它是UIImage
,而不是UIImageView
)。其次,egsBase
本身不是您要用于Interface Builder控件的类。最重要的是,这不是Interface Builder的插座,因此使用IBOutlet
代替img
只是令人困惑。 retain
。如果您正在编写ARC代码,则可能应该是strong
(即使您的目标是iOS 4.3)。如果您不编写ARC代码,则代码的其他地方会泄漏。 @synthesize
语句,它将为您合成实例变量和前导下划线。该领域是否应使用属性(我在下面做过)还是使用实例变量存在一些争议。我不太在乎,尽管新兴的约定可能倾向于更广泛地使用属性。如果使用属性,则(a)don't use the accessor methods in the initializer and dealloc methods;和(b)always use the accessor methods when setting properties。 loadXMLByURL
返回了指向类本身的指针。通常,只有init
对象或创建新对象的类才会返回指向自身的指针。 loadXMLByURL
应该应该返回(a)指向您构造的NSMutableArray
的指针(错误时返回nil
);或(b)BOOL
成功/失败值。 EGSBase
,编写description
方法很有用,因此您可以轻松地对其进行NSLog
。 <Products>
<products id="0">
<name>name1</name>
<img id="1">http://opentestdrive.com/images/first.png</img>
</products>
<products id="1">
<name>name2</name>
<img id="2">http://opentestdrive.com/images/second.png</img>
</products>
<products id="2">
<name>name3</name>
<img id="3">http://opentestdrive.com/images/img1.png</img>
</products>
<products id="3">
<name>name4</name>
<img id="4">http://opentestdrive.com/images/img2.png</img>
<img-subproduct id="0">http://opentestdrive.com/images/img5.png</img-subproduct>
<img-subproduct id="1">http://opentestdrive.com/images/img4.png</img-subproduct>
</products>
<products id="4">
<name>name5</name>
<img id="5">http://opentestdrive.com/images/img3.png</img>
<img-subproduct id="2">http://opentestdrive.com/images/img3.png</img-subproduct>
<img-subproduct id="3">http://opentestdrive.com/images/img2.png</img-subproduct>
</products>
<products id="5">
<name>name6</name>
<img id="6">http://opentestdrive.com/images/img4.png</img>
</products>
<products id="6">
<name>name7</name>
<img id="7">http://opentestdrive.com/images/img5.png</img>
</products>
</Products>
EGSProduct
定义如下:
// EGSProduct.h
#import <Foundation/Foundation.h>
@interface EGSProduct : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *imageUrlString;
@property (nonatomic, strong) NSString *imageIdentifier;
@property (nonatomic, strong) NSMutableArray *subProducts;
@end
// EGSProduct.m
#import "EGSProduct.h"
@implementation EGSProduct
- (NSString *)description
{
NSMutableString *result = [NSMutableString stringWithFormat:@"<EGSProduct %p; name='%@'; imageIdentifier='%@'; imageUrlString='%@'; subProducts=", self, self.name, self.imageIdentifier, self.imageUrlString];
NSMutableArray *subProductDescriptions = [NSMutableArray array];
for (EGSProduct *subProduct in self.subProducts)
{
[subProductDescriptions addObject:[subProduct description]];
}
[result appendFormat:@"%@>", [subProductDescriptions componentsJoinedByString:@"; "]];
return result;
}
@end
// EGSParser.h
#import <Foundation/Foundation.h>
@interface EGSParser : NSObject
@property (nonatomic, strong) NSMutableArray *products;
- (BOOL)loadXMLByURL:(NSURL *)url;
@end
// EGSParser.m
#import "EGSParser.h"
#import "EGSProduct.h"
@interface EGSParser () <NSXMLParserDelegate>
@property (nonatomic, strong) NSXMLParser *parser;
@property (nonatomic, strong) NSMutableString *currentElementContent;
@property (nonatomic, strong) EGSProduct *currentProduct;
@property (nonatomic, strong) EGSProduct *currentSubProduct;
@end
@implementation EGSParser
- (BOOL)loadXMLByURL:(NSURL *)url
{
self.parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
self.parser.delegate = self;
return [self.parser parse];
}
#pragma mark - NSXMLParser
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
self.products = [[NSMutableArray alloc] init];
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"products"])
{
self.currentProduct = [[EGSProduct alloc] init];
self.currentProduct.imageIdentifier = attributeDict[@"id"];
}
else if ([elementName isEqualToString:@"img-subproduct"])
{
self.currentSubProduct = [[EGSProduct alloc] init];
self.currentSubProduct.imageIdentifier = attributeDict[@"id"];
if (self.currentProduct.subProducts == nil)
{
self.currentProduct.subProducts = [NSMutableArray array];
}
self.currentSubProduct.imageIdentifier = attributeDict[@"id"];
self.currentElementContent = [[NSMutableString alloc] init];
}
else if ([elementName isEqualToString:@"name"] || [elementName isEqualToString:@"img"])
{
self.currentElementContent = [[NSMutableString alloc] init];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
// note, this construct of checking to see if it's nil is actually not needed
// (since sending a message to a nil object, by definition, does nothing)
// but I wanted to draw your attention to the fact that we set `currentElementContent`
// in `didStartElement` and, after saving it in our class, we set it to nil in
// `didEndElement`
if (self.currentElementContent != nil)
[self.currentElementContent appendString:string];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"name"])
{
self.currentProduct.name = self.currentElementContent; // save the product name
self.currentElementContent = nil; // reset our `currentElementContent`
}
else if ([elementName isEqualToString:@"img"])
{
self.currentProduct.imageUrlString = [self.currentElementContent stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
self.currentElementContent = nil;
}
else if ([elementName isEqualToString:@"img-subproduct"])
{
self.currentSubProduct.imageUrlString = self.currentElementContent;
self.currentElementContent = nil;
[self.currentProduct.subProducts addObject:self.currentSubProduct];
self.currentSubProduct = nil;
}
else if ([elementName isEqualToString:@"products"])
{
[self.products addObject:self.currentProduct];
self.currentProduct = nil;
}
}
@end
xmlProductsResults
即可)。在不同的视图控制器中,您需要将此模型数据保存在某个共享类(例如,模型单例),应用程序委托的属性中,或将其作为参数从视图控制器传递到视图控制器。
NSURL *url = [NSURL URLWithString:@"http://opentestdrive.com/Products.xml"];
EGSParser *parser = [[EGSParser alloc] init];
if ([parser loadXMLByURL:url])
{
NSLog(@"success; products=%@", parser.products);
self.xmlProductsResults = parser.products;
}
else
{
NSLog(@"fail");
}
关于iphone - 如何使用iphone sdk将XML解析的图像放入数组并在所有 View Controller 中使用该数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14659491/
我一直在使用 AJAX 从我正在创建的网络服务中解析 JSON 数组时遇到问题。我的前端是一个简单的 ajax 和 jquery 组合,用于显示从我正在创建的网络服务返回的结果。 尽管知道我的数据库查
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我在尝试运行 Android 应用程序时遇到问题并收到以下错误 java.lang.NoClassDefFoundError: com.parse.Parse 当我尝试运行该应用时。 最佳答案 在这
有什么办法可以防止etree在解析HTML内容时解析HTML实体吗? html = etree.HTML('&') html.find('.//body').text 这给了我 '&' 但我想
我有一个有点疯狂的例子,但对于那些 JavaScript 函数作用域专家来说,它看起来是一个很好的练习: (function (global) { // our module number one
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我需要编写一个脚本来获取链接并解析链接页面的 HTML 以提取标题和其他一些数据,例如可能是简短的描述,就像您链接到 Facebook 上的内容一样。 当用户向站点添加链接时将调用它,因此在客户端启动
在 VS Code 中本地开发时,包解析为 C:/Users//AppData/Local/Microsoft/TypeScript/3.5/node_modules/@types//index而不是
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我被赋予了将一种语言“翻译”成另一种语言的工作。对于使用正则表达式的简单逐行方法来说,源代码过于灵活(复杂)。我在哪里可以了解更多关于词法分析和解析器的信息? 最佳答案 如果你想对这个主题产生“情绪化
您好,我在解析此文本时遇到问题 { { { {[system1];1;1;0.612509325}; {[system2];1;
我正在为 adobe after effects 在 extendscript 中编写一些代码,最终变成了 javascript。 我有一个数组,我想只搜索单词“assemble”并返回整个 jc3_
我有这段代码: $(document).ready(function() { // }); 问题:FB_RequireFeatures block 外部的代码先于其内部的代码执行。因此 who
背景: netcore项目中有些服务是在通过中间件来通信的,比如orleans组件。它里面服务和客户端会指定网关和端口,我们只需要开放客户端给外界,服务端关闭端口。相当于去掉host,这样省掉了些
1.首先贴上我试验成功的代码 复制代码 代码如下: protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习 X
【PHP代码】 复制代码 代码如下: $stmt = mssql_init('P__Global_Test', $conn) or die("initialize sto
在SQL查询分析器执行以下代码就可以了。 复制代码代码如下: declare @t varchar(255),@c varchar(255) declare table_cursor curs
前言 最近练习了一些前端算法题,现在做个总结,以下题目都是个人写法,并不是标准答案,如有错误欢迎指出,有对某道题有新的想法的友友也可以在评论区发表想法,互相学习🤭 题目 题目一: 二维数组中的
我是一名优秀的程序员,十分优秀!