Получить номер строки в исходном документе вместо преобразованного документа с использованием XPath и Saxon в Java - PullRequest
0 голосов
/ 20 сентября 2018

Есть ли способ использовать Saxon в Java, который может вернуть номер строки соответствующего элемента в исходном документе?Например, у меня есть следующий XML

<property name="random name" value="
        -firstSentence=false
        -secondSentence=true
        -thirdSentence=true" />

Меня интересует 3-я строка в оригинальном документе.И я использовал следующий XPath:

/property[matches(@value, '^.*secondSentence=true.*$')]

И вызов getLineNumber в XdmNode в Saxon, он возвращает мне строку номер 2. Я обнаружил, что оригинальное форматирование XML-документа пропало при разборе в XdmNode с использованиемDocumentBuilder

Он вернул следующий форматированный xml и запустил XPath на нем

<property name="random name"
      value="                          -firstSentence=false                          -secondSentence=true                         -thirdSentence=true"/>

, в котором данные значения были сжаты в одну строку, и это строка, в которой запускается XPath ивозвращенный номер строки

Мне было интересно, есть ли у Saxon какой-либо возможный способ не иметь возможности автоматически форматировать XML-документ и обрабатывать на нем правило XPath, чтобы номер строки, возвращаемый из XdmNode, отражал эту точную строкув оригинальном документе?

Или, если вам известна какая-нибудь библиотека синтаксического анализа XML / XPath, которая может это сделать?

1 Ответ

0 голосов
/ 20 сентября 2018

Когда вы включаете нумерацию строк в Saxon, она сохраняет номера строк, сообщаемые анализатором XML.В случае синтаксического анализатора SAX номер строки, сообщаемый для каждого события SAX, представляет позицию в исходном файле конца конструкции, дающей начало этому событию.Атрибуты сообщаются как часть события startElement (), поэтому лучшее, что мы можем сделать, это сообщить о положении символа «>», появляющегося в конце начального тега.

Это фактически не имеет ничего общегос нормализацией значений атрибутов, которая представляет собой процесс, применяемый к значениям атрибутов анализатором XML, в результате чего символы новой строки и табуляции заменяются пробелами(Единственное, что объединяет эти две проблемы, это то, что в обоих случаях синтаксический анализатор XML следует правилам, и Саксон не может сказать, что делать иначе).

Если вы действительно хотите решить эту проблемувам, вероятно, придется сделать что-то похожее на то, что делает oXygen (я полагаю): он принимает номер строки и столбца, сообщаемый Saxon для конца начального тега, а затем считывает оттуда в исходном файле, чтобы найти, где находитсярелевантным атрибутом является то, что он может «пометить» атрибут-нарушитель, показав его подчеркнутым.

В качестве альтернативы возможно, что (имеется в виду, возможно, стоило бы выяснить, имеется ли) более точная информация о местоположении изпарсер Stax, такой как Woodstox или Aalto, где каждый атрибут уведомляется как отдельное событие.Если это так, то, хотя Saxon не может записать информацию о местоположении на уровне атрибутов, вы можете передать ее другим способом, например, с помощью пользовательского NodeFactory со связанной моделью дерева, чтобы поместить информацию в подклассстандартное представление ElementImpl элементов.

...