Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 未使用NSXmlparser解析CData_Ios_Ipad_Xml Parsing_Nsxmlparser_Cdata - Fatal编程技术网

Ios 未使用NSXmlparser解析CData

Ios 未使用NSXmlparser解析CData,ios,ipad,xml-parsing,nsxmlparser,cdata,Ios,Ipad,Xml Parsing,Nsxmlparser,Cdata,我从服务接收xml形式的响应,我使用nsxmlparser对其进行解析。 在一个实例中,我收到了一个xml,其中两个标记中的内容相同。(重复项如下xml所示) 收到的Xml: <UserGeneratedContentItem> <link rel="details" uri="http://api.test.no/test.Ugc/vivo/usergeneratedcontentitem/16046" /> <Data&g

我从服务接收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个字符**61Etikk og filosofihttp://api.test.no/test.Ugc/vivo/usergeneratedcontentitem/6]]>
注**6000个字符**61Etikk og filosofihttp://api.test.no/test.Ugc/vivo/usergeneratedcontentitem/6]]>
6000个字符包括字母表、算术和通用标点符号,将进行编码

问题:

In-(void)解析器:(NSXMLParser*)解析器foundCDATA:(NSData*)CDATA块 CDATA Block变量中的方法内容在两种情况下(两个标记)都不相同。在一种情况下,它给出了全部6000个字符,而在另一种情况下,它只给出了很少的字符,可能在300个字符左右。我确认的两种情况下,文本(6000个字符)都是相同的

原因可能是什么?有人能帮我吗?也许有人像我一样较早地遇到过这样的问题

请提前通知我是否有不清楚或不明白的地方。

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

CDATA-(未分析)字符数据

src:

PCDATA应该被解析


您必须保存NSData块(可能被调用N次,因此您必须对这些内容进行压缩),然后——在您的情况下——将结果解析为单独的XML,这就是cdata的用途——它不应该被解析

CDATA-(未分析)字符数据

src:

PCDATA应该被解析



您必须保存NSData块(可能被调用N次,因此您必须对这些内容进行压缩),然后——在您的情况下——将结果解析为单独的XML,只需调用以下函数和其他NSXMLParser函数。然后它将开始处理CDATA块

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

}

您可以NSLog someString,它将显示CDATA块的内容。

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

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

}

你可以记录一些字符串,它将向您显示CDATA块的内容。

TnQ非常感谢Dail-Djan的建议。我所做的是完全相同的。我正在挑选CDATA的数据,并形成一个xml,然后再次解析它。我的问题是CDATA块中的数据有时不可用。我知道我必须按原样附加文本调用N次。我的疑问是我如何知道CDATA迭代的结束(第N次)因此,我可以从xml中再次解析它。如果您有一个示例,这将更有帮助,其他建议也可以。再次请分享您的想法,这确实对我有很大帮助。更新:在我的情况下,CDATA被调用了N次,现在我使用了一个标志来追加文本并再次解析。目前在我的回复中CDATA块以结尾,当遇到时,我将结束CDATA块的结尾,并作为新的xml启动解析,只要我的响应以结尾,并且块中的内容没有文本作为结尾,就可以进行解析。是否有一种方法(如委托方法)可以让我知道CDATA块的结尾,这将是具体的解决方案,而不是依赖于一个标志和一个文本。再次使用TNQ。当NSXMLParser的另一个委托方法被调用时,我想…:/很抱歉这个调用类似于
parser:foundCharacters:
TnQ,非常适合Dail-Djan的建议。我所做的是完全相同的。我选择CDATA的数据并形成一个xml,然后再次解析它。我的问题是CDATA块中的数据有时不可用。我知道我必须将文本作为它可能会被调用N次。我的疑问是我如何知道CDATA迭代的结束(第N次)因此,我可以从xml中再次解析它。如果您有一个示例,这将更有帮助,其他建议也可以。再次请分享您的想法,这确实对我有很大帮助。更新:在我的情况下,CDATA被调用了N次,现在我使用了一个标志来追加文本并再次解析。目前在我的回复中CDATA块以结尾,当遇到时,我将结束CDATA块的结尾,并作为新的xml启动解析,只要我的响应以结尾,并且块中的内容没有文本作为结尾,就可以进行解析。是否有一种方法(如委托方法)可以让我知道CDATA块的结尾,这将是具体的解决方案,而不是依赖于一个标志和一个文本。再次使用TNQ。当NSXMLParser的另一个委托方法被调用时,我想…:/很抱歉此调用类似于解析器:foundCharacters:-1它有什么帮助?:)&&无论如何,这不是整个CDATA块,这是解析器这次发现的片段&&(我也一直这么做^^)这里不应该假设NSUTF8String,应该使用解析器确定的编码:)-1它有什么帮助?:)&&无论如何,这不是整个CDATA块,这是解析器这次发现的片段&&(我也一直这么做^^)这里不应该假设NSUTF8String,应该使用解析器确定的编码:)
-(void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock
{    
    NSString *someString = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];

}