2011-08-21 66 views
0

我想解析一个XML文件使用NSXMLParser,但方法[parser columnNumber]返回一个错误的值。举例来说,在我的.xml我:NSXMLParser列号是错误的

... 
<Test><something type="great"><lol>Joy</lol> // Three elements in the same line 
... 
</something> 
</Test> 

对于元素 “测试”,我得到了正确的路线:

<Test><something type="great"><lol>Joy</lol> 

但列号为 “6”。 在同一行,我得到列号“22”为元素“东西”:

"great"><lol>Joy</lol> 

这是一个预期的行为?

+0

我在苹果bug记者提交了一个错误,这似乎并不像预期的行为。 – Donovan

回答

0

编辑。两次头痛之前,我仍然充满希望。现在我认为将文件重新格式化以避免像同一行中的元素这样的奇怪事情并且执行一些空白字符清理会更好。但这很奇怪。什么错误。


嗯,这很奇怪,但我仍然在写一个答案。

我正在做一些测试,使用一个示例XML和一些从NSXML获得的行/列号。

<?xml version="1.0"?> 
<catalog class="something"> 
    <book id="bk101"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
     with XML.</description> 
... 

column, line 
OPEN/CLOS element 

等形式的日志(我在智能调试漂亮的小白)

15, 2 (A) 
OPEN catalog 
12, 3 (B) 
OPEN book 
14, 4 
OPEN author 
CLOS author 
13, 5 
OPEN title 
CLOS title 
13, 6 
OPEN genre 
CLOS genre 
13, 7 
OPEN price 
CLOS price 
20, 8 
OPEN publish_date 
CLOS publish_date 
19, 9 
OPEN description 
CLOS description 
CLOS book 
... 

有一种永远奏效一个公式,即:

columnPosition = columnNumber - length("<element>") 

例如,考虑第二行和日志附近(A):

<catalog class="something"> 

我希望columnPosition等于0,其实:

len("<catalog class>") = 15 
0 = 15 - length("<catalog class>") 

注意NSXML的columnNumber仍然是15不管我在“class”标签内部写入,但是当我移除整个标签时,它是9。用下面的一行:

<catalog> 

我希望columnPosition等于0,其实:

length("<catalog>") = 9 
0 = 9 - length("<catalog>") 

现在,考虑下面一行,在日志(B):

<book id="bk101"> 

我期待columnNumber等于3。其实:

length("<book id>") = 9 
3 = 12 - length("<book id>") 

好吧,这很奇怪。我认为这不是一个很好的解决方案,但至少它是有效的。我不能简单地删除字符串的开头空格,因为它没有,如果有这样一行:

<catalog class="something"><book id="bk101"> 

你觉得这个怎么样?我觉得挺有意思的,但是如果没有别的办法,我会检查这个答案作为接受的答案。我期待着你们的想法。


避免了简洁和缺乏意志的正式证明。

+1

哇!伟大的观察。我已经证实,这也是我发生的事情。 – arlomedia

0

为什么不在startElement方法中递增等级并在endElement中递减?这样你跟踪嵌套级别

+0

使用OP的答案中的“目录”示例,作者,标题和流派元素都会触发startElement方法,但您只想增加第一个的嵌套层次。有没有办法做到这一点,而不看parser.columnNumber? – arlomedia

+0

只有在找到指定的元素时,才必须在startelement方法增量中检查元素名称。特殊方法中减少相同的方式 – iosDeveloper