【问题标题】:Using NSXMLParser to parse xml with html inside nodes使用 NSXMLParser 在节点内解析带有 html 的 xml
【发布时间】:2015-05-07 20:59:21
【问题描述】:

我正在尝试读取带有内部 html 的 xml 文件以显示在 UIWebView 中。

我正在使用 NSXMLParser 解析传入的 XML 文件。像魅力一样工作。但是现在我想解析标签中包含的 HTML。

例如,解析得很好:

<item>
   <letter>a</letter>
   <word>word 1</word>
   <description>Yada yada</description>
</item>

但是这会导致解析器崩溃:

<item>
   <letter>a</letter>
   <word>word 1</word>
   <description><p>Yada</p></description>
</item>

因为解析器认为它应该翻译

显然是 xml 节点。

如何更改解析以处理内部 html?

我的类中用于解析 xml 的代码在方法 foundCharacters 上处理这些节点

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    // save the characters for the current item...
    if ([currentElement isEqualToString:@"letter"]) {
        [currentLetter appendString:string];
    } else if ([currentElement isEqualToString:@"word"]) {
        [currentWord appendString:string];
    } else if ([currentElement isEqualToString:@"description"]) {
        [currentDescription appendString:string];
    }

}

这在 didEndElement 上

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{     
    if ([elementName isEqualToString:@"item"]) {
        // save values to an item, then store that item into the array...
        [item setObject:currentLetter forKey:@"letter"];
        [item setObject:currentWord forKey:@"word"];
        [item setObject:currentDescription forKey:@"description"];

        [stories addObject:[item copy]];
    }

}

【问题讨论】:

  • “我怎样才能改变我的解析”——我们如何判断你是否没有显示任何解析代码?您如何定义“内部 HTML”?第二个例子是有效的 XML。
  • @MartinR 查看我编辑的笔记。我不希望解析器将

    作为 xml 节点处理,但它确实:)

  • 据我所知,没有办法让 NSXMLParser 跳过解析并将某些 XML 元素视为“普通文本”。
  • @MartinR CDATA 块不会这样做吗?
  • @JoakimM:这些信息在您的问题中也很有用:)

标签: objective-c xml xcode parsing


【解决方案1】:

将 xml 元素的内容包装在 CDATA 块中——这样解析器就不会将其视为 xml 并跳过它。 (不要将它与 PCDATA 混淆!解析的 CDATA 无济于事,但 CDATA 本身应该可以解决问题)

然后您可以使用第二个解析器来解析“内部 html”

【讨论】:

  • 所以我会在 xml 中有

    Yada

    ]]>
    ?
  • close: yada]]> (如果你真的需要,你甚至可以在客户端通过在解析之前预处理数据来做到这一点 -> 但是这意味着客户端的 CPU 时间和内存,应该避免!)
  • 谢谢!今晚会尝试一下,如果成功的话,把你的答案标记为解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2012-10-19
  • 1970-01-01
  • 2012-02-07
相关资源
最近更新 更多