Получить результат XPath в Саксонике с тегом XML - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь запросить файл XML, используя разные xpath с Saxonica API из net .sf.saxon , но кажется, что каждый раз, когда операции запроса возвращают результаты без тегов xml - только контент. Есть ли способ сделать это (прямой или обходной)?

Чтобы быть более точным:

Для xml файла

<books>
    <book lang="en">
        <nrpages>140</nrpages>
        <author>J.R.R.Tolkien</author>
    </book>
</books>

и xpath

//book

Я хотел бы получить

<book lang="en">
    <nrpages>140</nrpages>
    <author>J.R.R.Tolkien</author>
</book>

вместо

140
J.R.R.Tolkien

Что я пробовал:

XPathFactory factory = new XPathFactoryImpl();
XPathExpression compiledXPath = factory.newXPath().compile(xPathExpression);
TinyNodeImpl nodeItem = (TinyNodeImpl) compiledXPath.evaluate(new InputSource(filename), XPathConstants.NODE);
nodeItem.atomize(); // brings only the content
nodeItem.getStrinValue(); // brings only the content

1 Ответ

2 голосов
/ 06 февраля 2020

Выражение XPath возвращает узел; то, что вы делаете с узлом, зависит от кода вызывающего приложения. Если вы вызовете node.getStringValue(), вы получите строковое значение, как определено в спецификации XPath c (то есть, так же, как вызов fn:string() на узле в XPath). Точно так же метод atomize() следует XPath spe c для атомизации (эквивалентно fn:data(), примененному к узлу.)

Если вы хотите, чтобы узел сериализовался как лексический XML, есть различные способы достижения этого. Если бы вы использовали интерфейс S9oni Saxon вместо интерфейса JAXP, я бы порекомендовал XdmNode.toString(). Использование интерфейса JAXP, а затем приведение к внутренним классам Saxon дает вам худшее из обоих миров: вы получаете все проблемы JAXP (например, слабая типизация, отсутствие поддержки XPath 2.0) без каких-либо преимуществ (переносимость между реализациями). Но если вы предпочитаете делать это таким образом, то самым простым способом сериализации саксонских узлов, вероятно, является метод *1006* stati c. Версия метода с тремя аргументами дает вам полный контроль над свойствами сериализации, такими как отступ и добавление объявления XML.

В XPath 3.1 вы также можете вызывать сериализацию внутри самого выражения XPath, вызывая fn:serialize() ; это позволило бы избежать использования любых классов и методов Saxon c в коде Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...