简单的NSData类,用西里尔语解析XML

时间:2013-08-12 17:57:42

标签: ios objective-c xml nsdata

我必须用XML字符串解析NSData,有人知道简单的类别吗?我有这样的JSON,但我被迫使用XML。我尝试使用XMLReader,它的界面看起来很干净,但我发现了一些问题:

  1. 到处都是神秘的新行字符和空格:

    "comment_count" = {text = "\n              \n              21";};
    
  2. 我的西里尔符号看起来如此:

    "description_text" = {text = "\n              \U041f\U0438\U043a\U0430\U0431\U0443\U0448};
    
  3. 示例:

    <?xml version="1.0" encoding="UTF-8" ?>
    <news>
        <xml_count>43</xml_count>
        <hot_count>449</hot_count>
        <item type="text">
            <id>1469845</id>
            <rating>147</rating>
            <pluses>171</pluses>
            <minuses>24</minuses>
            <title>
                <![CDATA[Обновление огромного архива Пикабу!]]>
            </title>
            <comment_count>26</comment_count>
            <comment_link>http://pikabu.ru/story/obnovlenie_ogromnogo_arkhiva_pikabu_1469845</comment_link>
            <author>icq677555</author>
            <description_text>
                <![CDATA[Пикабушники, я обновил свой огромный архив текстовых постов из горячего!]]>
            </description_text>
        </item>
    </news>
    

1 个答案:

答案 0 :(得分:1)

我刚刚意识到发生了什么事。您的数据样本显然是在调试器中打印的NSDictionary个实例。所以你找到的问题是:

  1. 由于XML最初是作为带注释的文本格式设计的,因此空白(空格,换行符)处理并不完全适合仅数据使用。您可以修剪所有生成的字符串([stringVar stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]),调整XMLReader来执行此操作,或者使用http://ios.biomsoft.com/2011/09/11/simple-xml-to-nsdictionary-converter/处的XML解析器(默认情况下会这样做)。

  2. 您获得的西里尔字符的有趣输出是调试器输出中的非ASCII字符的正确转义(使用旧式属性列表格式)。它是调试器输出的工件。您的变量包含正确的字符。

  3. 顺便说一句:虽然JSON包含隐式类型信息(字符串总是引用,数字从不引用等),但没有模式文件的XML则不会。所以解析后的所有简单值都是字符串,即使它们最初都是数字。

    <强>更新

    您正在使用的XML解析器仍包含Pesky new lines and whitespace in XML reader class中描述的旧空白处理代码(尽管注释另有说明)。应用答案底部提到的修复,即更改行:

    [dictInProgress setObject:textInProgress forKey:kXMLReaderTextNodeKey];
    

    为:

    [dictInProgress setObject:[textInProgress stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] forKey:kXMLReaderTextNodeKey];