菜鸟教程小白 发表于 2022-12-12 18:49:50

ios - NSXMLParser "foundCharacters"未调用委托(delegate)方法


                                            <p><p>我在解析 XML 时遇到问题,所以我使用 NSLogs 浏览了我的代码并注意到
<code>- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string</code>
没有被调用。</p>

<p>我的 XML:</p>

<pre><code>&lt;?xml version=&#34;1.0&#34;?&gt;
&lt;locations&gt;
&lt;location&gt;
&lt;name&gt;Americas&lt;/name&gt;
&lt;address&gt;&lt;/address&gt;
&lt;gid&gt;CoQBdAAAAE2tdzw4RGvnvaUZTk6N1ByNtosmD--ZYfcmkkPkR6R6v_nN9gJCO1INOVg-S5rzy7BATEUmvAQzh8hClafZbph2wSgfD28gXNJAttXLUbqzQMaql3rVbisSUv2a2r_H6ktOSaI5lLvf0GNthT5jn2JfAdD_HfUls6qhMvrm5e5XEhDcF5uRjlfpSqI_aciS_QPaGhQVVHenbOKZBQMSoCzsoIsdfw313Q&lt;/gid&gt;
&lt;type&gt;
&lt;1&gt;political&lt;/1&gt;&lt;2/&gt;&lt;3/&gt;&lt;4/&gt;&lt;5/&gt;
&lt;/type&gt;
&lt;phone&gt;&lt;/phone&gt;
&lt;rating&gt;&lt;/rating&gt;
&lt;icon&gt;http://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png&lt;/icon&gt;
&lt;website&gt;&lt;/website&gt;
&lt;longitude&gt;-105.2551187&lt;/longitude&gt;
&lt;latitude&gt;54.5259614&lt;/latitude&gt;
&lt;/location&gt;
&lt;/locations&gt;
</code></pre>

<p>我的实现的相关部分</p>

<pre><code>- (void)viewDidLoad
{
    ;
...
    if(!self.distance){self.distance = @&#34;250000&#34;;}
    NSString *string = ;
    NSLog(@&#34;%@&#34;, string);
    NSURL *URL = ;
    NSXMLParser *parser = [ initWithContentsOfURL:URL];

    ;
    ;
    ;
    ;
    ;
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    self.element = elementName;
    if () {
      self.items    = [ init];
    }

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSLog(@&#34;HI&#34;); //Not outputted
    if () {
      self.result = [ init];
      ;
      NSLog(@&#34;%@&#34;, string);
    } else if () {
      ;
      NSLog(@&#34;%@&#34;, string);
    } else if () {
      ;
      NSLog(@&#34;%@&#34;, string);
    } else if () {
      ];
      NSLog(@&#34;%@&#34;, string);
    } else if () {
      ];
      NSLog(@&#34;%@&#34;, string);
    }

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if () {
      ;

    }

}

- (void)parserDidEndDocument:(NSXMLParser *)parser {

    ;

}
</code></pre>

<p>编辑 - 添加</p>

<pre><code>- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    NSLog(@&#34;%@&#34;,parseError);
}
</code></pre>

<p>什么也没得到。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>有几个问题:</p>

<ol>
<li><p>正如 wain 指出的,你应该实现 <code>parser:parseErrorOccurred:</code>,它会告诉你哪里出了问题。</p></li>
<li><p>如果 <code>searchterm</code> 包含任何作为 URL 保留字符的字符(例如空格、加号、& 符号等),我预计会出现问题。您应该始终对我认为是用户提供的搜索字词进行百分比转义并将其添加到 URL:</p>

<pre><code>NSString *string = , location.coordinate.latitude, location.coordinate.longitude, self.distance];
</code></pre>

<p>您可以使用如下方法:</p>

<pre><code>- (NSString *)percentEscapeString:(NSString *)string
{
    NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                                 (CFStringRef)string,
                                                                                 (CFStringRef)@&#34; &#34;,
                                                                                 (CFStringRef)@&#34;:/?@!$&amp;&#39;()*+,;=&#34;,
                                                                                 kCFStringEncodingUTF8));
    return ;
}
</code></pre>

<p>注意,不要依赖 <code>stringByAddingPercentEscapesUsingEncoding</code> 来进行百分比转义。你真的很想像上面一样使用 <code>CFURLCreateStringByAddingPercentEscapes</code>。</p></li>
<li><p>顺便说一句,您的 XML 格式不正确。我不相信 <code>NSXMLParser</code> 会接受数字元素名称。所以,而不是:</p>

<pre><code>&lt;type&gt;
    &lt;1&gt;political&lt;/1&gt;&lt;2/&gt;&lt;3/&gt;&lt;4/&gt;&lt;5/&gt;
&lt;/type&gt;
</code></pre>

<p>你可能想要:</p>

<pre><code>&lt;types&gt;
    &lt;type&gt;political&lt;/type&gt;
    &lt;type&gt;&lt;/type&gt;
    &lt;type&gt;&lt;/type&gt;
    &lt;type&gt;&lt;/type&gt;
    &lt;type&gt;&lt;/type&gt;
&lt;/types&gt;
</code></pre>

<p>或者,如果您确实需要这些数字标识符:</p>

<pre><code>&lt;types&gt;
    &lt;type id=&#34;1&#34;&gt;political&lt;/type&gt;
    &lt;type id=&#34;2&#34;&gt;&lt;/type&gt;
    &lt;type id=&#34;3&#34;&gt;&lt;/type&gt;
    &lt;type id=&#34;4&#34;&gt;&lt;/type&gt;
    &lt;type id=&#34;5&#34;&gt;&lt;/type&gt;
&lt;/types&gt;
</code></pre>

<p>在后一个示例中,您的 <code>didStartElement</code> 然后可以使用 <code>attributeDict</code> 来提取 <code>id</code> 标识符。</p></li>
<li><p>您报告 <code>parseErrorOccurred</code> 没有返回任何内容。这意味着您的服务器可能没有返回任何内容。这可能是由许多问题中的任何一个引起的。尝试使用您的 URL 并返回数据(例如,返回到 <code>NSString</code> 或 <code>NSData</code>,而不是解析器)并查看响应的样子。例如,出于测试目的,您可以这样做:</p>

<pre><code>NSError*error;
NSData   *data    = ;
NSString *results = [ initWithData:data encoding:NSUTF8StringEncoding];

// confirm error is `nil` and `results` is well-formed XML;
// you can then pass the `data` to `NSXMLParser` with `initWithData` if you want
</code></pre>

<p>我敢打赌它是空的(对于某些搜索词,这可能是由于缺少百分比转义,或者是由于任何无数的服务器问题造成的)。</p></li>
<li><p>这可能不是问题,但值得注意的是,将结果保存在 <code>foundCharacters</code> 中在概念上是有风险的,因为有时在 <code>didStartElement</code> 和 <code> 之间didEndElement</code>,您将多次调用 <code>foundCharacters</code> 来检索数据。一般人会在<code>didStartElement</code>中实例化一个<code>NSMutableString</code>,在<code>foundCharacters</code>中追加,然后保存在<code>didEndElement</code>中。 </p></li>
</ol></p>
                                   
                                                <p style="font-size: 20px;">关于ios - NSXMLParser&#34;foundCharacters&#34;未调用委托(delegate)方法,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/21784007/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/21784007/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - NSXMLParser &#34;foundCharacters&#34;未调用委托(delegate)方法