【问题标题】:XML Parse only certain child elementsXML 仅解析某些子元素
【发布时间】:2013-06-17 23:12:10
【问题描述】:

这可能是一个基本问题,但我有一个 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 作为发言者和他/她拥有的台词并将其添加到字典中。之后我想将字典添加到数组中,然后清除字典。

我该怎么做?

谢谢

【问题讨论】:

  • 问题是否与语言和工具集无关?
  • @BitT - rmaddy 完全正确地删除了 Xcode 标签(因为这不是关于 Xcode IDE 的问题)。但是您应该让我们知道这是 iOS 问题还是 Mac OS 问题。您还应该让我们知道您使用的是 NSXMLParser 还是其他解析器。随时更新问题并添加适当的标签(例如,NSXMLParser、iOS、MacOS 等)。

标签: iphone xml xml-parsing nsxmlparser


【解决方案1】:

我从您问题中的一个原始标签 推断出您在 Objective-C 中正在执行此操作。我将进一步假设您想使用NSXMLParser

所以,假设您有 (a) 一个可变数组 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

[value appendString:string];

并且,在您的didEndElement 中,如果您遇到扬声器,请设置它,如果您遇到一行,请添加它,如果您遇到SPEECH 结束标签,请继续添加演讲(及其@987654341 @ 和 LINES 致您的一系列演讲:

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 教程”。

【讨论】:

    【解决方案2】:

    如果您使用 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();
    

    【讨论】:

      猜你喜欢
      • 2014-11-19
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 2020-09-20
      • 2020-07-01
      • 2014-09-21
      相关资源
      最近更新 更多