2013-02-21 3 views
0

Примера:Найти родительский элемент в недопустимой строке XML в заданном положении

...some string content here... 
<test> 
    <a> 
     ...something... 
    </a> 
    <a/> 
    {position 1} 
    <b>{position 2} 
     <c> 
      ...something else... 
      {position 3} 
     </c> 
     <c/> 
     <d> 
      <e/> 
      {position 4} 
      <e> 
       ...another thing here... 
       {position 5} 
      </e> 
     </d> 
     {position 6} 
    </b> 
    {position 7} 
...more xml and other sting content... 

мне нужно найти родительский элемент в охватывающем (например) позициях , указанные выше.

Результаты: {position 1} = test {position 2} = b {position 3} = c {position 4} = d {position 5} = e {position 6} = b {position 7} = тест

Примечание: - ни один из каких-либо имен элементов тегов известно - строка отверстия может включать ноны содержимого XML - размер данных очень большой (> 50MB текстового файл)

Должна быть внедрена техника поиска для чтения назад, начиная с заданной позиции, до действительного соответствия (если любой).

Thanx

+0

Какой язык вы используете? У вас есть возможность загрузить эту строку в объект XML, а затем выполнить родительскую функцию find? Кажется, что это было бы более гладкое решение, чем регулярное выражение. – cepatt

+2

Каждый язык, который я знаю, имеет большие XML-парсеры или обертывания libxml или тому подобное. Если данные огромны, используйте потоковый парсер, например expat. –

+0

Язык: C# Его слишком большой для загрузки, а также он содержит недопустимый контент или неприемлемые символы – mtsiakiris

ответ

1

Invalid XML не может быть разобрано, по определению. Вот почему любой синтаксический анализатор XML просто откажется его разобрать и вернуть ошибку.

Если анализаторы XML не могут его разобрать, вы тоже можете (в основном). То, о чем вы просите, это не простая строка или простая коллекция тегов, которые можно захватить регулярным выражением. Вы действительно должны сделать полный сингл (возможно, недопустимых данных!), Чтобы найти родительские теги в определенном месте.

Обновление: Чтобы посмотреть, о чем я говорю, подумайте о поиске родителя {position 1} в вашем примере.

  • Упрощенный подход к этой проблеме может заключаться в «возврате назад и найти открывающий тег». Но вы явно не можете взять первый открывающий тег, который вы найдете (<a>), потому что он закрывается перед положением.
  • Итак, когда вы идете назад, вы должны увидеть </a> и помнить, что тег <a> был закрыт, чтобы вы не считали <a> родителем.
  • И, конечно же, до того, как вы дойдете до родителя, может быть произвольное количество открытых и закрытых тегов. Вы должны следить за всеми из них (включая множественные вхождения одного и того же тега).

Как вы можете видеть, это довольно сложно. И это до того, как вы допустите любые недопустимые элементы в файле.

Один простой подход, который может работать: если вы точно знаете, что такое файлы, вы можете удалить эти ошибки, а затем скопировать исправленный файл в синтаксический анализатор XML.

В противном случае вам придется написать собственный пользовательский парсер для конкретной марки недопустимого XML. И это может быть даже невозможно, в зависимости от типа ошибок в файле.

+0

Это была первая мысль. Удалите ошибки и разбор, но некоторые теги не имеют соответствующего закрывающего тега, и это приведет к потере некоторых данных. Кроме того, существуют пользовательские теги, например. ... где я не знаю имена пространства имен. Хотя я могу использовать настройки xmlreader для игнорирования пространств имен, мне придется загрузить весь xml. В настоящее время я читаю только назад из данной позиции и пытаюсь достичь имени стартового элемента, где я называю его «корневым узлом» позиции. – mtsiakiris

+0

@mtsiakiris, если «некоторые теги не имеют соответствующего закрывающего тега». Я думаю, что ваша задача в принципе невозможна. – 2013-02-21 15:33:49

+0

невозможно? нет, ничего невозможного .. это просто важно, насколько сложно вам это сделать. возможно, невероятное было бы более точным. @mtsiakiris, я думаю, что вы застряли, делая то, что делаете. Начиная с вашей известной точки и чтения назад, пока вы не достигнете своего «родительского узла». Это будет некрасиво. – cepatt