Неверный номер столбца NSXMLParser - PullRequest
0 голосов
/ 21 августа 2011

Я пытаюсь проанализировать файл XML с помощью NSXMLParser, но метод [parser columnNumber] возвращает неправильное значение.Например, в моем .xml у меня есть:

...
<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>

Это ожидаемое поведение?

Ответы [ 2 ]

0 голосов
/ 13 марта 2012

Почему бы вам не увеличить уровень в методе startElement и не уменьшить в endElement? таким образом вы отслеживаете уровень вложенности

0 голосов
/ 22 сентября 2011

Редактировать . Две головные боли назад я все еще надеялся. Теперь я думаю, что гораздо лучше переформатировать файл, чтобы избежать странных вещей, таких как элементы в одной строке, и выполнить некоторую очистку пробелов. Но это странно. Что за ошибка


Ну, это довольно странно, но я все равно пишу ответ.

Я проводил несколько тестов с примером 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>")

Обратите внимание, что 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 Избегать формальных доказательств краткости и отсутствия воли.

...