使用Spring Integration无法从文档中获取xml节点数

时间:2019-02-20 22:38:08

标签: spring spring-boot xpath spring-integration

我正在尝试使用Spring集成int-xml:xpath-header-enricher来获取// Ephemeris / Record元素的计数。无论传入的文档如何,它都会返回零。

<!-- 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 :(得分:0)

您必须像这样配置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中使用它来根据某些名称空间正确区分元素。

我认为默认的DocumentBuilderFactory并不尊重命名空间,这在涉及多个命名空间支持时使您可能的XPath表达式变得更加可怕。