BizTalk业务规则检查节点存在性和值

BizTalk业务规则检查节点存在性和值,biztalk,business-rules,biztalk-rule-engine,Biztalk,Business Rules,Biztalk Rule Engine,我有以下问题。我想执行一个策略,检查节点是否存在,然后检查值是否大于0 <xmlDoc> <test>5</test> </xmlDoc> 假设我们有“xmlDoc”,我想检查节点“test”是否存在,以及“test”的值是否大于0 <xmlDoc> <test>5</test> </xmlDoc> 5. 当节点存在时,没有问题。但是,当节点丢失时,所有的坏消息都会丢失。。 很

我有以下问题。我想执行一个策略,检查节点是否存在,然后检查值是否大于0

<xmlDoc>
    <test>5</test>
</xmlDoc>
假设我们有“xmlDoc”,我想检查节点“test”是否存在,以及“test”的值是否大于0

<xmlDoc>
    <test>5</test>
</xmlDoc>

5.
当节点存在时,没有问题。但是,当节点丢失时,所有的坏消息都会丢失。。 很明显他为什么会撞车。他找不到节点“test”,因此无法检查其值


我的问题:在BizTalk BRE中是否可以检查节点的存在性和值,而不使其崩溃?

条件列表中有“exists”谓词,但是,这并不总是有效的,因为值事实也会被计算

我发现解决这个问题的一种方法是创建一个词汇表项,并调整选择器以指向可能不存在的元素,在您的示例中是“text”

然后XPath字段将是/text()节点


这样,如果选择器路径返回null,则BRE知道该事实不存在,因此不会评估需要该事实的规则。

如果不存在检查与值检查一起执行,则BRE不会按预期工作

解决方案:

如果节点不存在,下面的函数将返回节点值和空字符串。 使用此函数的返回值执行值检查

声明:XML文档。 路径:XML路径

    public static string GetXMLPathValue(TypedXmlDocument claim, string path)
    {
        string nodeContent = string.Empty;

        if (claim.Document.SelectSingleNode(path) != null)
            return claim.Document.SelectSingleNode(path).InnerXml;
        return nodeContent;
    }

谢谢你的回答。我有点像你那样解决了。但是我想知道BRE是否可以检查节点是否存在,如果确实存在,是否可以检查节点的值。这样,规则仍然会被评估,这就是我想要的,这与更改选择器的作用差不多,尽管我会将其描述为“仅当节点存在时才评估规则”。是的,我使用相同的技术,有时还会更改选择器以测试节点是否不存在,以执行其他操作(例如,发出丢失的警告)。