2013-06-20 73 views
0

這可能是一個基本的問題,但是,我有一玩就是XML格式。我想抓住揚聲器和揚聲器在字典中的行,以便將其添加到數組中。這裏是格式XML解析只有特定的子元素

<SPEECH> 
    <SPEAKER>Narrator</SPEAKER> 
    <LINE>Two households, both alike in dignity,</LINE> 
    <LINE>In fair Verona, where we lay our scene,</LINE> 
    <LINE>From ancient grudge break to new mutiny,</LINE> 
    <LINE>Where civil blood makes civil hands unclean.</LINE> 
    <LINE>From forth the fatal loins of these two foes</LINE> 
    <LINE>A pair of star-cross'd lovers take their life;</LINE> 
    <LINE>Whole misadventured piteous overthrows</LINE> 
    <LINE>Do with their death bury their parents' strife.</LINE> 
    <LINE>The fearful passage of their death-mark'd love,</LINE> 
    <LINE>And the continuance of their parents' rage,</LINE> 
    <LINE>Which, but their children's end, nought could remove,</LINE> 
    <LINE>Is now the two hours' traffic of our stage;</LINE> 
    <LINE>The which if you with patient ears attend,</LINE> 
    <LINE>What here shall miss, our toil shall strive to mend.</LINE> 
</SPEECH> 

所以我想抓住Narrator爲揚聲器和他/她的線,並將其添加到字典中。之後,我想將字典添加到數組中,然後清除字典。

我該怎麼做?

感謝

+0

是語言和工具集不可知的問題嗎? – Vlad

+0

@BitT - rmaddy完全正確地刪除了Xcode標籤(因爲這不是關於Xcode IDE的問題)。但是,您應該讓我們知道這是iOS問題還是Mac OS問題。您還應該讓我們知道您是否使用NSXMLParser或其他解析器。隨意更新問題並添加適當的標籤(例如,NSXMLParser,iOS,MacOS等)。 – Rob

回答

2

我從你的問題,原來的標籤中的一個推斷,即你正在Objective-C中做這件事。我會進一步假設你想使用NSXMLParser

所以,讓我們假設你有(一)speeches一個可變數組; (b)當前speech的可變字典; (c)每種語音的可變數組lines;和(d)可變字符串value,它將捕獲在元素名稱的開始和該元素名稱的結尾之間找到的字符。

然後,你必須實現NSXMLParserDelegate方法。例如,當你分析,你didStartElement,如果你遇到一個語音元素的名稱,您創建一個字典:

if ([elementName isEqualToString:@"SPEECH"]) { 
    speech = [[NSMutableDictionary alloc] init]; 
    lines = [[NSMutableArray alloc] init]; 
} 
else 
{ 
    value = [[NSMutableString alloc] init]; 
} 

正如你在foundCharacters遇到的人物,你會添加這些到value

而且,在你didEndElement,如果遇到揚聲器,設置它,如果你遇到一個行中,添加它,如果你遇到SPEECH關閉標籤,繼續前進,添加語音(其SPEAKERLINES你的演講陣容:

if ([elementName isEqualToString:@"SPEAKER"]) { 
    [speech setObject:value forKey:@"SPEAKER"]; 
} 
else if ([elementName isEqualToString:@"LINE"]) { 
    [lines addObject:value]; 
} 
else if ([elementName isEqualToString:@"SPEECH"]) { 
    [speech setObject:lines forKey:@"LINES"]; 
    [speeches addObject:speech]; 
    speech = nil; 
    lines = nil; 
} 
value = nil; 

欲瞭解更多信息,請參閱Event-Driven XML Programming Guide或谷歌 「的NSXMLParser教程」。

0

如果使用C#,如果每個SPEECH只有1 SPEAKER你可以做以下

XDocument xdoc = XDocument.Load("XMLFile1.xml"); 

List<string> lines = xdoc.Descendants("SPEECH").Where(e => e.Element("SPEAKER").Value.ToUpper() == "NARRATOR").Elements("LINE").Select(e => e.Value).ToList();