GVKun编程网logo

objective-c – 在Cocoa中解析XML(c 解析xml文件)

11

如果您对objective-c–在Cocoa中解析XML和c解析xml文件感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解objective-c–在Cocoa中解析XML的各种细节,并对c解析x

如果您对objective-c – 在Cocoa中解析XMLc 解析xml文件感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解objective-c – 在Cocoa中解析XML的各种细节,并对c 解析xml文件进行深入的分析,此外还有关于objective-c – .NET程序员学习Objective C和Cocoa有多难?、objective-c – Cocoa – 如何格式化XML文件、objective-c – Cocoa中的助手功能、objective-c – Cocoa中的绘图选择框(橡皮筋,行进蚂蚁),ObjectiveC的实用技巧。

本文目录一览:

objective-c – 在Cocoa中解析XML(c 解析xml文件)

objective-c – 在Cocoa中解析XML(c 解析xml文件)

今天我正在研究如何在Cocoa(用于桌面)中制作一个简单的XML解析器。我正在考虑使用NSXMLParser解析数据,但不太确定从哪里开始。 Web上的XML文件没有太多的数据,只是一个简单的列表,我需要保存一个变量。有没有人对如何做到这一点有任何建议,因为关于这个的在线文档没有太多的意义。

感谢任何帮助!

编辑我想要创建XML解析器的原因是从服务器上的MysqL数据库获取信息到客户端应用程序。如果除了XML解析器之外还有更好的方法,请让我知道!

解决方法

以下是它的工作原理:

有一个类叫NSXMLParser。它用于解析XML文件。然而,NSXMLParser是愚蠢的。所有它知道如何做是解析XML,但它不知道它应该做什么与​​它找到的信息。

输入代表。代表就像一个保姆。由于XMLParser没有一个线索如何处理它发现的信息,它会去询问它的委托关于每一件事情:“嘿,我开始解析一个文件,我应该做什么吗? “嘿,我找到了一些CDATA!我应该怎么做啊!” “嘿,我找到另一个标签!” “嘿!我找到了一个关闭标签!”等等。所有这些“嘿!”语句是委托方法,也就是说,它们是委托对象可以选择实现的可选方法。通常(但不总是),创建NSXMLParser的对象也是委托,但不一定是这样。

所以你可能会有这样的东西:

NSXMLParser * parser = [[NSXMLParser alloc] initWithContentsOfURL:someURLToAnXMLFile];
[parser setDelegate:self];
[parser parse];
[parser release];

然后在同一个对象(self)中,你可能有以下一些方法:

- (void)parserDidStartDocument:(NSXMLParser *)parser {
  //the parser started this document. what are you going to do?
}

- (void)parser:(NSXMLParser *)parser didStartElement:(Nsstring *)elementName namespaceURI:(Nsstring *)namespaceURI qualifiedname:(Nsstring *)qualifiedname attributes:(NSDictionary *)attributeDict {
  //the parser found an XML tag and is giving you some information about it
  //what are you going to do?
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(Nsstring *)string {
  //the parser found some characters inbetween an opening and closing tag
  //what are you going to do?
}

- (void)parserDidEndDocument:(NSXMLParser *)parser {
  //the parser finished. what are you going to do?
}

文档中列出了一大堆这些方法。只需转到NSXMLParser类引用,它们都列在“委托方法”部分下。一旦你得到它的悬念,NSXMLParser是很容易使用。这是一个SAX Parser,这意味着它是事件驱动的解析器。它找到东西,它告诉你。

objective-c – .NET程序员学习Objective C和Cocoa有多难?

objective-c – .NET程序员学习Objective C和Cocoa有多难?

我正在尝试为我自己的公司构建双平台应用程序,我试图在晚上开始.

我已完成.NET版本,但尚未完成UI部分.我正在考虑购买一些第三方控件.

但是,如果我购买这些控件,它们显然只适用于我的Windows版本.我想知道我是否应该尝试在GTK中使用UI并使用Mono和CocoaSharp,或者只是用MS技术构建它并自学Mac端?

我真的不熟悉Mac世界,我想知道可能有多少学习曲线.

我想也许用Ruby或Python重写我的核心逻辑.这就是为什么我可以将.NET版本与.NET控件一起使用,并且可能在Mac上挂起相同的代码.

这是一个针对消费者的教育应用程序.因此,安装不需要很多技术复杂性.

解决方法

如果.NET应用程序的非可视部分与UI相比非常大,那么您可以使用完整的.NET并采用以下两步策略:

>非视觉部分

>开发非可视.NET部分,使其成为最独立的平台.
>用于非可视代码的平台相关代码应该在提供相同接口的小类中隔离,以便可以根据平台插入它们.

>用户界面

>对Windows使用System.Windows.Forms(或您最喜欢的工具包)
>对于Mac OS X,请使用Cocoa桥(请参阅this page选项).

您仍然可以从学习Objective-C中受益:由于Cocoa桥通常基于Apple的API,您可以在Apple的示例代码中找到很多帮助(在Objective-C中).

在Windows上,应用程序将与Microsoft .NET运行时一起运行,在Mac OS X上,应用程序将与Mono运行时一起运行.

DeepMeta application采用了这种策略.正如您所看到的,两个平台上的用户体验非常好.

objective-c – Cocoa – 如何格式化XML文件

objective-c – Cocoa – 如何格式化XML文件

有没有办法在编程时以正确的方式格式化 XML文件?

例如,如果我使用此代码创建一个简单的XML文件:

NSXMLElement *fallback_driver = [[NSXMLElement alloc] initWithName:@"fallback-driver"];

NSXMLElement *folder = [[NSXMLElement alloc] initWithName:@"folder"];
[folder setStringValue:[ads_make objectValueOfSelectedItem]];
NSXMLElement *filename =[[NSXMLElement alloc] initWithName:@"filename"];
[filename setStringValue:ads_driver_name_selected];

[fallback_driver addChild:folder];
[fallback_driver addChild:filename];

NSXMLElement* rootNode = [ads_user_printxml rootElement];
[rootNode addChild:fallback_driver];

当这个运行时,我想按照下图中的注释部分输出,而不是实际的XML(没有注释).

我如何以这种方式格式化XML文件?谢谢!

附:

谢谢你的答案.但是,我想将我拥有的NSXMLDocument转换为NSData以便保存…

我在尝试

NSData *newData = [[ads_user_printxml XMLDataWithOptions:NSXMLNodePrettyPrint]XMLData];

但是我收到一条警告,“’NSData’可能无法响应’-XMLData’,在我添加XMLDataWithOptions之前,它工作得很好.我也尝试了’XMLStringWithOptions’方法(如你所说 – 但是认为数据更多适当的),但产生了相同的警告.

有任何想法吗?非常感谢!

解决方法

您可以使用以下命令输出格式良好的XML字符串:

Nsstring* string = [xmlNode XMLStringWithOptions:NSXMLNodePrettyPrint];

请注意,因为NSXMLDocument和NSXMLElement是NSXMLNode的子类,所以您也可以对这些类执行此操作.

如果你想要NSData而不是字符串,只需:

NSData* xmlData = [xmlNode XMLDataWithOptions:NSXMLNodePrettyPrint];

objective-c – Cocoa中的助手功能

objective-c – Cocoa中的助手功能

帮助器/效用函数在Obj-C类中的标准方法是什么?

即通用功能在整个应用程序中使用并被超过1类调用。

一个Obj-C方法可以存在于一个类之外,还是需要一个C函数才能有这样的行为?

解决方法

Objective-C有很多选择。首先,由于Obj-C是C的严格超集,您可以在单独的模块(源文件)中定义所有的库函数,并从任何已经具有的Obj-C对象/代码中快乐地调用它们。如果创建一个对象源文件(.m文件),则可以调用/使用对象。

如果您的通用函数在逻辑上操纵其他已建立的对象(对于实例,在Nsstring上运行),则可以使用类别将函数映射到已存在的类(这在哪里有意义)。

最后,正如Tony指出的那样,你可以使用静态方法创建类(尽管我个人喜欢这个选项)。我倾向于使用一个二者的混合,在适当的地方添加类别,并为其他人使用标准功能。我通常只做一个新课程,设计一个班级是有意义的。

objective-c – Cocoa中的绘图选择框(橡皮筋,行进蚂蚁),ObjectiveC

objective-c – Cocoa中的绘图选择框(橡皮筋,行进蚂蚁),ObjectiveC

我目前使用鼠标事件实现了一个简单的选择框,并在鼠标拖动时重绘了一个矩形.这是我的代码:

-(void)drawRect:(NSRect)dirtyRect
{
if (!NSEqualRects(self.draggingBox,NSZeroRect))
{
    [[NSColor grayColor] setstroke];
    [[NSBezierPath bezierPathWithRect:self.draggingBox] stroke];
}
}

#pragma mark Mouse Events

- (void)mouseDown:(NSEvent *)theEvent
{
    NSPoint pointInView = [self convertPoint:[theEvent locationInWindow] fromView:nil];
    self.draggingBox = NSMakeRect(pointInView.x,pointInView.y,0);
    [self setNeedsdisplay:YES];
}

- (void)mouseDragged:(NSEvent *)theEvent
{
    NSPoint pointInView = [self convertPoint:[theEvent locationInWindow] fromView:nil];
    _draggingBox.size.width = pointInView.x - (self.draggingBox.origin.x);
    _draggingBox.size.height = pointInView.y - (self.draggingBox.origin.y);
    [self setNeedsdisplay:YES];
}

- (void)mouseUp:(NSEvent *)theEvent
{
    self.draggingBox = NSZeroRect;
    [self setNeedsdisplay:YES];
}

参考:http://cocoadev.com/HowToCreateWalkingAnts

问题:

这是最有效的方法吗?如果视图很复杂,在主视图上绘制透明视图而不是在鼠标拖动持续时间内不断重绘视图(http://www.cocoabuilder.com/archive/cocoa/99877-drawing-selection-rectangle.html)会更有效吗?这是怎么做到的?我似乎无法找到任何例子.

解决方法

如果需要,您可以使用QuartzCore为您设置“行进蚂蚁”的动画.这使您完全脱离了手动绘制橡皮带选择框的世界.您只需定义定义该框的路径,让Core Animation负责绘制框,并为其设置动画.

在XIB的“视图效果”检查器中,打开“核心动画”,然后您可以执行以下操作:

#import <QuartzCore/QuartzCore.h>
#import "CustomView.h"

@interface CustomView ()

@property (nonatomic) NSPoint startPoint;
@property (nonatomic,strong) CAShapeLayer *shapeLayer;

@end

@implementation CustomView

#pragma mark Mouse Events

- (void)mouseDown:(NSEvent *)theEvent
{
    self.startPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil];

    // create and configure shape layer

    self.shapeLayer = [CAShapeLayer layer];
    self.shapeLayer.linewidth = 1.0;
    self.shapeLayer.strokeColor = [[NSColor blackColor] CGColor];
    self.shapeLayer.fillColor = [[NSColor clearColor] CGColor];
    self.shapeLayer.lineDashPattern = @[@10,@5];
    [self.layer addSublayer:self.shapeLayer];

    // create animation for the layer

    CABasicAnimation *dashAnimation;
    dashAnimation = [CABasicAnimation animationWithKeyPath:@"lineDashPhase"];
    [dashAnimation setFromValue:@0.0f];
    [dashAnimation setTovalue:@15.0f];
    [dashAnimation setDuration:0.75f];
    [dashAnimation setRepeatCount:HUGE_VALF];
    [self.shapeLayer addAnimation:dashAnimation forKey:@"linePhase"];
}

- (void)mouseDragged:(NSEvent *)theEvent
{
    NSPoint point = [self convertPoint:[theEvent locationInWindow] fromView:nil];

    // create path for the shape layer

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMovetoPoint(path,NULL,self.startPoint.x,self.startPoint.y);
    CGPathAddLinetoPoint(path,point.y);
    CGPathAddLinetoPoint(path,point.x,self.startPoint.y);
    CGPathCloseSubpath(path);

    // set the shape layer's path

    self.shapeLayer.path = path;

    CGPathRelease(path);
}

- (void)mouseUp:(NSEvent *)theEvent
{
    [self.shapeLayer removeFromSuperlayer];
    self.shapeLayer = nil;
}

@end

通过这种方式,Core Animation将为您提供行军蚂蚁.

关于objective-c – 在Cocoa中解析XMLc 解析xml文件的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于objective-c – .NET程序员学习Objective C和Cocoa有多难?、objective-c – Cocoa – 如何格式化XML文件、objective-c – Cocoa中的助手功能、objective-c – Cocoa中的绘图选择框(橡皮筋,行进蚂蚁),ObjectiveC的相关知识,请在本站寻找。

本文标签: