NSXMLParser的解析方法是异步的吗?
换句话说,如果我有一个NSXMLParse对象,并且我[someParseObject parse]
从主线程调用,它会阻止主线程吗?
我正在使用NSXMLParser从url解析xml(我的代码与此处的代码几乎完全相同)
一些元素包含特殊字符,如"á",这使得一个单词很可能被分成两个(á和ndre).
这是我的loadXMLByURL
-(id) loadXMLByURL:(NSString *)urlString{
tickets = [[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;}
Run Code Online (Sandbox Code Playgroud)
我很确定这是因为没有设置编码(我认为它需要是NSUTF8StringEncoding)但我不知道在哪里/如何应用它.
[更新]我的其余代码......
- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementname isEqualToString:@"ticket"])
{
currentTicket = [Ticket alloc];
}
}
- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementname isEqualToString:@"name"])
{
currentTicket.name = currentNodeContent;
} …
Run Code Online (Sandbox Code Playgroud) 我有以下代码泄漏.仪器说它是rssParser对象泄漏.我"刷新"XML feed并运行块并且它泄漏....
file.h
@interface TestAppDelegate : NSObject <UIApplicationDelegate> {
NSXMLParser *rssParser;
}
Run Code Online (Sandbox Code Playgroud)
file.m
NSData *data = [ NSURLConnection sendSynchronousRequest:request returningResponse: nil error: nil ];
rssParser = [[NSXMLParser alloc] initWithData:data];
[rssParser setDelegate:self];
[rssParser setShouldProcessNamespaces:NO];
[rssParser setShouldReportNamespacePrefixes:NO];
[rssParser setShouldResolveExternalEntities:NO];
[rssParser parse];
[rssParser release];
Run Code Online (Sandbox Code Playgroud)
泄漏的图像....
我有一个XML文件,其中包含我想要使用的一些数据:
<?xml version="1.0" encoding="UTF-8" ?>
<items>
<item name="product" price="19.95" where="store">
This is the first product.
</item>
<item name="product2" price="39.95" where="online">
This is the second product.
</item>
<item name="product3" price="99.95" where="garagesale">
This is the third product.
</item>
</items>
Run Code Online (Sandbox Code Playgroud)
如果我制作了4个数组,一个用于名称,一个用于价格,一个用于购买,一个用于描述,如何将数据输入数组?
我想使用的NSXMLParser,但不能得到name
,price
,where
或说明.
我一直坚持如何做到这一点.
任何帮助赞赏.
更新:
使用NSXMLParser
类方法时initWithContentsOfURL
,不是在下载XML提要时进行解析,而是尝试将整个XML文件加载到内存中,然后才启动解析过程.如果XML提要量很大(使用过多的RAM,本身效率低下,因为它不是与下载并行解析,而是仅在下载完成后才开始解析等),这是有问题的.
有没有人发现如何使用源将数据流传输到设备来解析NSXMLParser
?是的,您可以使用LibXML2
(如下所述),但似乎应该可以使用它NSXMLParser
.但这是在逃避我.
原始问题:
我正在努力使用NSXMLParser
从Web流中读取XML.如果您使用initWithContentsOfURL
,虽然界面可能会导致人们推断它会从Web流式传输XML,但它似乎不会这样做,而是在尝试进行任何解析之前尝试先加载整个XML文件.对于适度大小的XML文件来说这很好,但是对于非常大的XML文件来说,这是有问题的.
我已经看到NSXMLParser
了initWithStream
与NSInputStream
从网络流式传输的一些定制使用相关的讨论.例如,有一些答案建议使用类似下面的Cocoa Builder帖子中CFStreamCreateBoundPair
引用的内容和Apple Stream Programming Guide中关于设置套接字流的讨论,但我还没有使用它.我甚至尝试写我自己的子类是使用(这是它本身,在流还不错),但我无法得到它与一起工作.NSInputStream
NSURLConnection
NSXMLParser
最后,我决定使用LibXML2
而不是NSXMLParser
,如Apple XMLPerformance示例中所示,但我想知道是否有人有幸从使用的网络源获取流媒体NSXMLParser
.我见过很多"理论上你可以做X "之类的答案,这一切从CFStreamCreateBoundPair
给抓住了HTTPBodyStream
从NSURLRequest
,但我还没有遇到与流的工作演示NSXMLParser
.
Ray Wenderlich文章如何为您的iPhone项目选择最佳的XML解析器似乎证实它NSXMLParser
不适合大型XML文件,但是所有帖子都有关于NSXMLParser
基于可能的解决方案的流量来传输非常大的XML文件,我我很惊讶我还没有找到这方面的工作示范.有谁知道NSXMLParser
从网络流出的功能实现?显然,我可以坚持使用LibXML2
或者其他一些等效的XML解析器,但是流式传输的概念NSXMLParser
似乎非常接近.
有没有人知道如何使用事件驱动的模型NSXMLParser类解析以下xml?
<Node>
<name> Main </name>
<Node>
<name> Child 1 </name>
</Node>
<Node>
<name> Child 2 </name>
</Node>
</Node>
Run Code Online (Sandbox Code Playgroud)
我想从这个xml文件中收集所有三个名字,是否可能,或者我必须更改为基于树的解析?
我正在创建一个需要从网页获取一些数据的iOS应用程序.我的第一个是使用NSXMLParser initWithContentsOfURL:
和解析NSXMLParser
代表的HTML .然而,这种方法似乎很快就会变得痛苦(例如,如果改变了HTML,我将不得不重写解析代码,这可能很尴尬).
看到我正在加载一个网页,我也看了一下UIWebView
.看起来UIWebView
可能是要走的路.stringByEvaluatingJavaScriptFromString:
似乎是一种非常方便的方法来提取数据,并允许将javascript存储在一个单独的文件中,如果HTML发生变化,该文件很容易编辑.然而,使用UIWebView
似乎有点hacky(看作UIWebView
是一个UIView
子类,它可能会阻止主线程,并且文档说javascript有10MB的限制).
在我遇到困难之前,有没有人对解析XML/HTML有任何建议?
更新:
我写了一篇关于我的解决方案的博客文章:iOS中的HTML解析/屏幕抓取
我正在关注本教程,作为我正在Swift工作的RSS馈送器应用程序的快速入门.我知道自从本教程以来Swift中有一些变化,但它们似乎都没有解释为什么我遇到这个问题.
相关代码(据我所知)在我的TableViewController中如下:
override func viewDidLoad() {
super.viewDidLoad()
let url:NSURL = NSURL(string: "my.url.string")
parser = NSXMLParser(contentsOfURL: url)
parser.delegate = self
parser.parse() // <- Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
}
Run Code Online (Sandbox Code Playgroud)
实际的解析器委托方法似乎没有问题,因为我在它们上放置了断点,甚至在崩溃之前都没有调用它们.
我的假设是它是一个Swift错误,但我想在我向苹果抱怨之前确保我没有遗漏一些东西.
我正在对Aadhar卡进行条形码或QR码扫描.我得到的响应为以下xml格式.如何使用xml解析将其转换为字典格式?
<?xml version="1.0" encoding="UTF-8"?><PrintLetterBarcodeData uid="685860050795" name="Sangeetha D" gender="F" yob="1989" co="W/O: Dhanansekaran" house="632" street="saradhambal nagar" lm="agaramel" vtc="Nazarathpettai" po="Nazarethpettai" dist="Tiruvallur" subdist="Poonamallee" state="Tamil Nadu" pc="600123" dob="03/06/1989"/>
Run Code Online (Sandbox Code Playgroud)
我尝试了以下代码进行解析
public func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
currentElement=elementName;
print(currentElement)
}
public func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
currentElement="";
}
public func parser(parser: NSXMLParser, foundCharacters string: String) {
}
Run Code Online (Sandbox Code Playgroud)
但它总是返回currentElement
"PrintLetterBarcodeData"
NSXMLParser有三种类型的init.
- > init
- > initWith Data
- > init的initWithContents
=>但是我的xml文件存储在Application的Document目录中,所以如何解析存储在"Doc Dir"中的文件
提前致谢.
nsxmlparser ×10
iphone ×6
ios ×5
objective-c ×4
xml-parsing ×3
nsxml ×2
swift ×2
xml ×2
cocoa ×1
concurrency ×1
memory-leaks ×1
nsxmlelement ×1
uiwebview ×1
xcode ×1
xcode6 ×1