从XML文件中提取字符串? (使用TBXML)

时间:2011-06-06 17:01:36

标签: objective-c xml dom

读取和加载没有问题,但我不确定从特定位置获取字符串的语法。

例如,使用此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>

我怎么说...
“来自故事中ID为01的页面中的charName,故事中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需要多少才能变重?

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

由于您已经将所有故事从XML加载到模型对象中,因此您可能会发现使用模型对象更容易,更快,只能从XML保存和加载。这也允许您处理解析后的XML数据,而不是模型在运行时需要的数据,而不是无限期地保留两个不同的表示。

对于plists与XML:如果你使用plist友好的数据类型,使用plist加载和保存要简单得多,因为你所做的所有复兴工作都是为你完成的。但由于您使用的是模型类而不是原始NSArray / NSDictionary集合,因此您可能不会看到使用TBXML的好处。

简化代码的一件事是让对象知道如何在给定适当的TBXML对象的情况下构建自己。您将加载XML文档并将其传递给Story初始化程序,而不是使用了解整个数据层次结构的大量loadStories方法,而初始化程序将初始化其场景,传递文档(以及相应的父元素) )到一个场景初始化器,它将负责建立它的孩子,并在线上。然后每个类都担心确保它被初始化,并且对层次结构的更改最终会在单个类中而不是在这些上帝方法中进行本地化。

答案 2 :(得分:0)

XML有一个荒谬的开销,很快就会产生非常低效的效率。

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


是的,我知道我实际上并没有解决问题。这个答案是为了一个更简单,更好的解决方案。