2011-06-06 67 views
0

阅读和加载没有问题,但我不确定从特定位置抓取字符串的语法。从XML文件中提取字符串? (使用TBXML)

例如,与该XML ...

<stories> 
    <story ID="01" name="Story 1"> 
    <scenes> 
     <scene ID="01" name="Scene 1"> 
     <pages> 
      <page ID="01"> 
      <charName> 
       n010101 
      </charName> 
      <charTalk> 
       s010101 
      </charTalk> 
      </page> 
     </pages> 
     </scene> 
    </scenes> 
    </story> 
</stories> 

我怎么会说...
“从CHARNAME与ID 01在场景ID 01的场景ID页的详情页01故事”

为路径,这将是这样的:
stories > story 01 > scenes > scene 01 > pages > page 01 > charName

我已经看了实现TBXML其他项目,但我不能找到我”寻找。
(我也是在通过别人的源代码,看着真糟糕,所以我可能已经遇到不止一次。)

My loadStories method on Pastebin

编辑:我不知道......这是更快, TBXML或plist,哪个更容易编码?
它们都被完全加载到内存中,所以它归结为行计数,可读性和解析时间。

...
仍然在等待一个答案。如果有人可以向我推荐一个好的(有用的)教程,我不介意转换到NSXMLParser,但是TBXML要轻得多,即使它的文件大小足够大。
无论如何,TBXML变得沉重需要多少钱?

+0

您是否正在寻找一种类似功能的关键路径? – 2011-06-07 13:27:01

+0

@Deepak“关键路径”?那是什么? – Thromordyn 2011-06-07 13:33:12

+0

我以为你想要一种快速访问方法,你可以通过'stories.story [id = '01'] .scenes.scene [id = '01']。pages.page [id = '01']。charName '并获得价值。 – 2011-06-07 13:42:24

回答

0

XML有一个荒谬的额外开销,它可以在任何时候都变得非常低效。

属性列表很容易处理,并且将内容转换为原始数据并不困难。
NSJSON不是绝对最快的,但它支持ARC并且实现起来要简单得多。


是的,我知道我没有真正解决问题。这个答案是一个更简单,更好的解决方案。

0

据我所知,TBXML没有API来做你想做的事情。您必须自己编写XML树的导航代码。如果您只有一种或两种类型的查询,这应该不会太糟糕。 libxml确实支持XPath,因此如果您需要在运行时对XML执行各种不同类型的查询,您可能会考虑使用它。

既然你已经加载所有从XML故事变成模型对象,不过,你可能会发现它更容易和更快与模型对象的工作,只有保存和加载的XML。这也使您可以将分析的XML数据置于您的模型在运行时需要的地方,而不是无限地保存两个不同的表示。

至于对的Plist XML:只要你使用的plist友好的数据类型,负载和使用的plist节能要简单得多,因为所有你这样做还原工作是为你做。但是由于您使用的是模型类而不是原始的集合,因此与使用TBXML相比,您可能看不到什么好处。

简化代码的一件事就是让对象知道如何根据适当的TBXML对象来构建自己。您可以加载XML文档并将其传递给Story初始化程序,该初始化程序将初始化其场景,并将文档(以及适当的父元素)传递到场景,而不是大量的知道关于整个数据层次结构的一切的loadStories方法初始化器,它将照顾建立其子女,并在线下。然后,每个班级都担心确保它已经初始化,并且对层次结构的更改最终会局限于一个类中,而不是放在这些上帝方法中。

+0

我有点认为这将是一个任务,把它变成可用的东西。虽然我在这方面的工作,但是,有可能使用当前的实现吗?我想有一个工作(尽管效率低下)的实现,所以有一个明确的目标,而不仅仅是“做我想做的事情”。 (比较A到B比A比1更容易,你知道吗?) – Thromordyn 2011-06-07 14:54:24

+0

@Thromordyn TBXML可以浏览XML树,所以你可以随心所欲地做任何事情。你会写自己的“走过根的孩子,直到我找到与匹配ID的故事,抓住那个故事,现在走过它的孩子,直到我找到我想要的ID的场景,好吧,现在抓住那个场景和......“如果将其分解为诸如'-sceneWithID:'和'-storyWithID:'之类的方法,它可能会更干净。如果你想直接使用XML,你可能需要一些更像'-sceneWithID:parentElement:'的东西。 – 2011-06-07 14:57:40

+0

我的意思是我不确定如何说“在A中搜索A,然后在A中搜索B等”。呃,我会先去找更好的选择。 //带有超级创意名称的新类,用于保存检索特定charName和charTalk值的方法...我会看看我能做什么。 – Thromordyn 2011-06-07 15:20:25

1

我正在寻找作为字符串的文档,并且TBXML不支持它。我最终添加了一个属性到TBXML类xmlString并存储从URL中读取的字符串。

- (id)initWithURL:(NSURL*)aURL 
{ 
    self.xmlString = [NSString stringWithContentsOfURL:aURL encoding:NSUTF8StringEncoding error:nil]; 

    self = [self initWithXMLString:self.xmlString]; 
    if (self != nil) { 
    } 
    return self; 
}