【问题标题】:CData not being parsed with NSXmlparser未使用 NSXmlparser 解析 CData
【发布时间】:2012-12-13 19:00:33
【问题描述】:

我从服务接收到 xml 形式的响应,我使用 nsxmlparser 对其进行解析。 在一个实例中,我收到了一个 xml,其中两个标签中的内容相同。(重复项目如下 xml)

已收到 Xml:

<UserGeneratedContentItem>
    <link
      rel="details"
      uri="http://api.test.no/test.Ugc/vivo/usergeneratedcontentitem/16046" />
    <Data><![CDATA[<Type>Note</Type><Description>**6000 characters**</Description><Page>6</Page><ChapterNumber>1</ChapterNumber><ChapterTitle>Etikk og filosofi</ChapterTitle><Uri>http://api.test.no/test.Ugc/vivo/usergeneratedcontentitem/6</Uri><Data><StickyNotes><StickyNote name="icon_2" X="215.8" Y="352.7" note="**6000 characters**" dateTime="null" popupX="940" popupY="119" popupWidth="300" popupHeight="180" formatedDate ="2012-12-28-18-20-47" iconImage="1003"/></StickyNotes></Data>]]></Data>
  </UserGeneratedContentItem>
  <UserGeneratedContentItem>
    <link
      rel="details"
      uri="http://api.test.no/test.Ugc/vivo/usergeneratedcontentitem/16046" />
    <Data><![CDATA[<Type>Note</Type><Description>**6000 characters**</Description><Page>6</Page><ChapterNumber>1</ChapterNumber><ChapterTitle>Etikk og filosofi</ChapterTitle><Uri>http://api.test.no/test.Ugc/vivo/usergeneratedcontentitem/6</Uri><Data><StickyNotes><StickyNote name="icon_2" X="215.8" Y="352.7" note="**6000 characters**" dateTime="null" popupX="940" popupY="119" popupWidth="300" popupHeight="180" formatedDate ="2012-12-28-18-20-47" iconImage="1003"/></StickyNotes></Data>]]></Data>
  </UserGeneratedContentItem>

6000 个字符包括将被编码的字母、算术和一般标点符号。

概率:

在 -(void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock CDATABlock 变量中的方法内容在两种情况下都不相同(两个标签)。在一种情况下,它给了我全部 6000 个字符,在另一种情况下,它只给了我几个可能是 300 个字符左右。文本(6000 个字符)在我确认的两种情况下都是相同的。

可能是什么原因?有人可以帮助我,可能是像我一样之前遇到过此类问题的任何人。

Tnx 提前。如果有不清楚或不理解的地方,请告诉我。

【问题讨论】:

    标签: ios ipad xml-parsing nsxmlparser cdata


    【解决方案1】:

    这就是 cdata 的用途——它不应该被解析

    CDATA -(未解析的)字符数据

    源代码:http://www.w3schools.com/xml/xml_cdata.asp

    应该解析PCDATA


    你必须保存 NSData 块(可能被调用 N 次,所以你必须连接那些东西)并且 - 在你的情况下 - 然后将结果解析为单独的 XML

    【讨论】:

    • TnQ 非常感谢 Dail-Djan 的建议。我正在做的是完全相同的。我正在挑选 CDATA 的数据并形成一个 xml 并再次解析它。我的问题是数据有时,CDATA 块中存在的内容不可用。我知道我必须附加文本,因为它可能被称为 N 次。我的疑问是我如何知道 CDATA 迭代的结束(第 N 次)以便我可以从一个 xml 并再次解析它。如果你有样本,其他建议也会有帮助。Tnq 再次请分享你的想法,它真的对我有很大帮助。
    • 更新:在我的情况下,CDATA 被调用 N 次,现在我已经使用一个标志来附加文本并再次解析它。目前在我的响应中,CDATA 块以 结尾Data> 并且当遇到 时,我正在结束 CDATA 块并启动解析为新的 xml,只要我的响应以 结尾并且块中的内容没有文本,它就可以工作作为 。有没有一种方法(如委托方法)可以让我知道 CDATA 块的结尾,这将是具体的解决方案,而不是依赖于标志和文本。 TNQ 再一次。
    • 结束了,当我猜想调用另一个 NSXMLParser 的委托方法时...:/对不起..这个调用类似于parser:foundCharacters:
    【解决方案2】:

    只需调用以下函数以及其他 NSXMLParser 函数。然后它将开始处理 CDATA 块。

    -(void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock
    {    
        NSString *someString = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];
    
    }
    

    你可以 NSLog someString,它会显示 CDATA 块的内容。

    【讨论】:

    • -1 它有什么帮助? :) && 无论如何,这不是整个 CDATA 块,这是解析器这次找到的片段 &&(我也一直这样做^^)这里不应该假设 NSUTF8String,应该使用解析器确定的编码:)
    猜你喜欢
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2010-11-08
    • 2012-02-18
    • 2012-02-13
    相关资源
    最近更新 更多