Невозможно получить количество узлов xml из документа, используя интеграцию Spring - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь получить количество элементов // Ephemeris / Record, используя интеграцию пружин int-xml: xpath-header-enricher.Он возвращается к нулю независимо от того, какой документ был передан.

<!-- Send the count of //Record(s) to the metrics server -->
<int:chain input-channel="metricsEmphemeris">
    <int-xml:xpath-header-enricher>
        <int-xml:header name="COUNT" xpath-expression="count(//Ephemeris/Record)" overwrite="true"/>
    </int-xml:xpath-header-enricher>

    <int:logging-channel-adapter level="ERROR" log-full-message="true" />

</int:chain>



    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Ephemeris SchemaVersion="1.0" SequenceID="1" Source="MICRO" MessageTime="1524602523222" MessageClassification="UNCLASSIFIED" xmlns:ns2="http://www.sandia.gov/pgmm/MeasurementTypes" xmlns="http://www.sandia.gov/pgmm/Ephemeris">
        <SensorName>SYS-1A</SensorName>
        <Record>
            <Type>PREDICTED</Type>
        </Record>
    </Ephemeris>

Я также воспроизвел его в этом блоке кода:

    XPathExpression expression = XPathExpressionFactory.createXPathExpression("count(//Ephemeris/Record)");


    Node node = new DefaultXmlPayloadConverter().convertToNode(FileUtils.readFileToString(new File(uri)));

    //Always zero
    Object value = expression.evaluateAsString(node);
    System.out.println(value);

    //This works!
    Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(uri));
    value = expression.evaluateAsString(document);
    System.out.println(value);

1 Ответ

0 голосов
/ 21 февраля 2019

Вы должны настроить выражение XPath следующим образом:

   <int-xml:xpath-expression id="countExpression" expression="count(//ns:Ephemeris/ns:Record)"
                  ns-prefix="ns"
                  ns-uri="http://www.sandia.gov/pgmm/Ephemeris"/>

И вместо этого иметь его в качестве ссылки из <int-xml:header>.

Проблема в том, что ваш корневой элемент вXML поставляется с xmlns="http://www.sandia.gov/pgmm/Ephemeris", поэтому другого пути нет, если мы не соблюдаем пространства имен в вашем исходном XML.Для этой цели мы вводим искусственный префикс, даже если ваш исходный XML уже есть.Это необходимо в XPath для правильного различения элементов на основе некоторого пространства имен.

Я думаю, что default DocumentBuilderFactory просто не учитывает пространства имен, что делает ваши возможные выражения XPath очень ужасными, когда речь заходит о поддержке нескольких пространств имен.

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