【问题标题】:Extract a string from an XML file? (Using TBXML)从 XML 文件中提取字符串? (使用 TBXML)
【发布时间】:2011-06-06 17:01:36
【问题描述】:

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

例如,使用这个 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 &gt; story 01 &gt; scenes &gt; scene 01 &gt; pages &gt; page 01 &gt; charName

我查看了其他实现 TBXML 的项目,但找不到我想要的。
(我也很不擅长看别人的源代码,所以我可能不止一次遇到过。)

My loadStories method on Pastebin

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

...
还在等待答案。如果有人可以向我抛出一个好的(有用的)教程,我不介意切换到 NSXMLParser,但是 TBXML 更轻量,即使它的占用空间稍大,文件也很大。
无论如何,TBXML 变重需要多少?

【问题讨论】:

  • 您是否在寻找功能之类的关键路径?
  • @Deepak“关键路径”?那是什么?
  • 我以为您想要某种快速访问方法,您可以在其中传递 stories.story[id='01].scenes.scene[id='01'].pages.page[id='01'].charName ` 并获取值。
  • @Deepak 是的,类似的。我需要调整一些东西才能让它工作,但我不知道从哪里开始。重读-loadStories 是一个开始,我猜...
  • XPath 会让这变得非常简单,不是吗?

标签: objective-c xml dom


【解决方案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;
}

【讨论】:

    【解决方案2】:

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

    不过,由于您已经将所有故事从 XML 加载到模型对象中,您可能会发现使用模型对象并仅从 XML 保存和加载更容易、更快捷。这也让您可以将解析的 XML 数据与模型在运行时需要的内容分开处理,而不是无限期地保留两种不同的表示形式。

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

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

    【讨论】:

    • 我有点想把它变成可用的东西是一项艰巨的任务。但是,虽然我正在努力,是否可以按原样使用当前的实现?我希望有一个有效的(尽管效率低下)实现,所以有一个明确的目标,而不仅仅是“做我想做的事情”。 (比较 A 和 B 比比较 A 和 1 更容易,你知道吗?)
    • @Thromordyn TBXML 可以导航 XML 树,因此您可以使用它做任何您想做的事情。您将编写自己的“遍历根的子节点,直到找到具有匹配 ID 的故事,抓住那个故事,现在遍历它的子节点,直到找到具有我想要的 ID 的场景,好吧,现在抓住那个场景并且……”如果你把它分解成-sceneWithID:-storyWithID:这样的方法,它可能会更干净。如果您想直接使用 XML,您可能需要类似 -sceneWithID:parentElement: 的内容。
    • 我的意思是我不确定如何在代码中准确地说“搜索 A,然后在 A 中搜索 B,等等”。嗯,我还是先选更好的吧。 // 一个具有超级创意名称的新类,用于保存检索特定 charName 和 charTalk 值的方法...我会看看我能做什么。
    【解决方案3】:

    XML 的开销非常大,很快就会变得非常低效。

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


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

    【讨论】:

      猜你喜欢
      • 2013-09-29
      • 1970-01-01
      • 2013-05-02
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多