2011-06-06 58 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; 
}