通过 xpath for Camel 中的字符索引获取子字符串
Getting a substring by index of a character in xpath for Camel
我正在使用 Camel 并尝试根据 xml 文件设置一些 headers。问题是我需要设置 2 headers,它们在 xml 中组合成一个属性,并用冒号 ':' 分隔。
这是 xml 行:
<Alarm AlarmID="CC4567:180" DeviceID="CC0000:10.254.0.146" TimeStamp="2016-01-31 18:51:29.488">
我需要将AlarmID 的两部分分开。我知道我可以使用以下内容:
<camel:setHeader headerName="firstPart">
<xpath resultType="java.lang.String">substring(/ticket/alarmId,1,6)</xpath>
</camel:setHeader>
但问题是第一部分实际上并不限于 6 个字符。我已尝试以下操作,但出现错误:
substring(/ticket/alarmId, 1, indexOf(':')-1)
错误:
camel.builder.xml.InvalidXPathExpression: 无效的 xpath: substring(/ticket/alarmId, indexOf(':'))。原因:javax.xml.xpath.XPathExpressionException:net.sf.saxon.trans.XPathException:未知的系统函数 indexOf()
所以我的问题是有没有另一种方法可以做到这一点,因为 camel 似乎不支持 indexOf()。目标是我可以拥有 2 headers、firstPart=CC4567 和 secondPart=180
看起来您正在使用 saxon,它不支持它不包含名为 indexOf 的函数。您需要使用有效的 xPath 函数来完成您想要完成的工作。尝试使用 xPath 2.0 中的 tokenize() 函数,它应该允许您在“:”处拆分字符串。
似乎 IndexOf 不是定义的函数,但 substring-before() 和 substring-after()
是,它们非常适合我的情况:
<camel:setHeader headerName="firstPart">
<xpath resultType="java.lang.String">substring-before(/ticket/alarmId, ':')</xpath>
</camel:setHeader>
<camel:setHeader headerName="secondPart">
<xpath resultType="java.lang.String">substring-after(/ticket/alarmId, ':')</xpath>
</camel:setHeader>
正如另一个答案中所建议的那样,使用 Tokenizer 也是可能的,使用它看起来像这样:
<camel:setHeader headerName="firstPart">
<xpath resultType="java.lang.String">tokenize(/ticket/alarmId,':')[1]</xpath>
</camel:setHeader>
<camel:setHeader headerName="secondPart">
<xpath resultType="java.lang.String">tokenize(/ticket/alarmId,':')[2]</xpath>
</camel:setHeader>
我选择了前一个选项,因为我认为它具有更好的可读性
我正在使用 Camel 并尝试根据 xml 文件设置一些 headers。问题是我需要设置 2 headers,它们在 xml 中组合成一个属性,并用冒号 ':' 分隔。
这是 xml 行:
<Alarm AlarmID="CC4567:180" DeviceID="CC0000:10.254.0.146" TimeStamp="2016-01-31 18:51:29.488">
我需要将AlarmID 的两部分分开。我知道我可以使用以下内容:
<camel:setHeader headerName="firstPart">
<xpath resultType="java.lang.String">substring(/ticket/alarmId,1,6)</xpath>
</camel:setHeader>
但问题是第一部分实际上并不限于 6 个字符。我已尝试以下操作,但出现错误:
substring(/ticket/alarmId, 1, indexOf(':')-1)
错误:
camel.builder.xml.InvalidXPathExpression: 无效的 xpath: substring(/ticket/alarmId, indexOf(':'))。原因:javax.xml.xpath.XPathExpressionException:net.sf.saxon.trans.XPathException:未知的系统函数 indexOf()
所以我的问题是有没有另一种方法可以做到这一点,因为 camel 似乎不支持 indexOf()。目标是我可以拥有 2 headers、firstPart=CC4567 和 secondPart=180
看起来您正在使用 saxon,它不支持它不包含名为 indexOf 的函数。您需要使用有效的 xPath 函数来完成您想要完成的工作。尝试使用 xPath 2.0 中的 tokenize() 函数,它应该允许您在“:”处拆分字符串。
似乎 IndexOf 不是定义的函数,但 substring-before() 和 substring-after()
是,它们非常适合我的情况:
<camel:setHeader headerName="firstPart">
<xpath resultType="java.lang.String">substring-before(/ticket/alarmId, ':')</xpath>
</camel:setHeader>
<camel:setHeader headerName="secondPart">
<xpath resultType="java.lang.String">substring-after(/ticket/alarmId, ':')</xpath>
</camel:setHeader>
正如另一个答案中所建议的那样,使用 Tokenizer 也是可能的,使用它看起来像这样:
<camel:setHeader headerName="firstPart">
<xpath resultType="java.lang.String">tokenize(/ticket/alarmId,':')[1]</xpath>
</camel:setHeader>
<camel:setHeader headerName="secondPart">
<xpath resultType="java.lang.String">tokenize(/ticket/alarmId,':')[2]</xpath>
</camel:setHeader>
我选择了前一个选项,因为我认为它具有更好的可读性