我正在尝试使用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);
答案 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表达式变得更加可怕。