Стандартная библиотека .Net, поддерживающая XPath 3.1 - PullRequest
0 голосов
/ 22 мая 2019

Я поддерживаю устаревший инструмент компании, для которой я работаю, написанную на C #, и я конвертирую ее в стандарт .Net 2.0. Он использует процессор Saxon-HE для обработки некоторых XPath и замены некоторых конфигураций в файлах. Его пакет NuGet в .NET имеет зависимости, которые не позволяют выполнять все платформы, соответствующие стандарту .Net 2.0 (в моем случае и .Net Framework, и ядро ​​.Net), поэтому мне нужно заменить его на один другой инструмент, лучше, если стандартная библиотека .Net XPath.

Проблема заключается в том, что инструмент использует некоторые XPath, которые выполняют сложные операции, такие как объединение строк и выбор элемента массива, и я не знаю, является ли это синтаксисом, специфичным для саксонской, или относится к стандарту.

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

Вот несколько примеров:

Во-первых:

for $row in /Item/SubItem[*]/SubSubItem return(concat($row, \"/ConcatValue\"))

Второе:

/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]

Вам что-нибудь известно об этом синтаксисе XPath?

Спасибо

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Для выражений XPath, которые вы привели в качестве примеров, требуется процессор XPath 2.0, но они не относятся к Saxon.

Выражение

for $row in /Item/SubItem[*]/SubSubItem return(concat($row, \"/ConcatValue\"))

- это ForExpression, характерный для XPath 2.0, и его нелегко преобразовать в XPath 1.0, поскольку его результатом является последовательность строк, а в XPath 1.0 такого типа данных нет.

Выражение

/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]

специфичен для XPath 2.0, поскольку в RHS оператора "/" используется выражение в скобках; и снова, потому что он возвращает последовательность строк.

Боюсь, я не могу сообщить вам, существуют ли библиотеки XPath 2.0, работающие в .NET Core, что, как я полагаю, является вашим требованием. Нельзя заставить Saxon работать на .NET Core из-за его зависимости от IKVM, которая не поддерживает эту платформу и которую (насколько я понимаю) нельзя легко приспособить для этого.

Обратите внимание, что XPath 2.0 является подмножеством XQuery 1.0, поэтому вы можете расширить поиск как для процессоров XQuery 1.0, так и для процессоров XPath 2.0.

0 голосов
/ 23 мая 2019

Благодаря этому комментарию я смог протестировать XPath2.Net и теперь все работает.Мне нужно было изменить только один тип определения XPath

Этот:

/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]

Меняется на

/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(.), '')[1]

Обратите внимание на дополнительный аргумент точки string()функция.Это странно, так как не нужно указывать точку;фактически, в соответствии с стандартным

В версии функции с нулевым аргументом $ arg по умолчанию используется для элемента контекста.То есть вызов fn: string () эквивалентен вызову fn: string (.)

, но XPath2 жалуется на эту ошибку

{"The function 'string'/0 was not found in namespace 'http://www.w3.org/2003/11/xpath-functions'"}

UPDATE:

После обновления библиотеки XPath2.Net до версии 1.0.8 синтаксис string() работает.

...