我正在尝试使用NSXMLParser解析XML文件,但方法[parser columnNumber]
返回错误的值。例如,在我的.xml中我有:
...
<Test><something type="great"><lol>Joy</lol> // Three elements in the same line
...
</something>
</Test>
对于元素“Test”,我得到了正确的行:
<Test><something type="great"><lol>Joy</lol>
但列号为“6”。 在同一行中,我得到元素“某事”的列号“22”:
"great"><lol>Joy</lol>
这是预期的行为吗?
答案 0 :(得分:0)
修改的。两个头疼前我仍然充满希望。现在我认为重新格式化文件以避免像同一行中的元素之类的奇怪事情并进行一些空白清理要好得多。但这很奇怪。真是个bug。
嗯,这很奇怪,但无论如何我都在写答案。
我正在使用示例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
...
有一个公式总是起作用 1 ,即:
columnPosition = columnNumber - length("<element>")
例如,考虑第二行和(A)附近的日志:
<catalog class="something">
我希望columnPosition
等于0
,事实上:
len("<catalog class>") = 15
0 = 15 - length("<catalog class>")
请注意,无论我在“class”标记内写什么,NSXML的columnNumber
仍然是15
,但是当我删除整个标记时,它是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 为了简洁和缺乏意志而避免使用正式证据。
答案 1 :(得分:0)
为什么不在startElement方法中增加level并在endElement中减少?这样你就可以跟踪嵌套级别