Wix - 如何使用XmlConfig和Xpath删除父节点集

时间:2015-03-05 20:47:00

标签: xpath wix quartz.net

如何在XmlConfig中找到text()节点并使用它来删除父节点集。我见过的所有例子都找到并删除了“找到的”#39;节点不是父节点。

我的理解是这个Xpath通过验证路径找到匹配的节点,而ElementPath是要删除的节点的路径。但它根本不起作用。

支持text()吗?我尝试了[[* =' ATrigger' []],[[]。=' ATrigger' []]但仍然没有运气。

        <util:XmlConfig Id="RemoveATriggerCompletely" File="[#QuartzXmlJob]" Sequence="104" Action="delete" On ="install" Node="element"
            ElementPath="//job-scheduling-data/schedule/" 
            VerifyPath="//job-scheduling-data/schedule/trigger/cron/name[\[]text()='ATrigger'[\]]"/>

给出以下XML

<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
<schedule>
    <trigger>
        <cron>
            <name>ATrigger</name>
            <group>default</group>
            <description>Every 2 minutes</description>
            <job-name>ATriggerJob</job-name>
            <job-group>defaultGroup</job-group>
            <misfire-instruction>SmartPolicy</misfire-instruction>
            <!-- every 5mins -->
            <cron-expression>2 * * * * ?</cron-expression> 
        </cron>
    </trigger>

    <trigger>
        <cron>
            <name>BTrigger</name>
            <group>default</group>
            <description>Every 2 minutes</description>
            <job-name>BTriggerJob</job-name>
            <job-group>defaultGroup</job-group>
            <misfire-instruction>SmartPolicy</misfire-instruction>
            <!-- every 5mins -->
            <cron-expression>2 * * * * ?</cron-expression> 
        </cron>
    </trigger>

我需要的输出是

<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
<schedule>
    <trigger>
        <cron>
            <name>BTrigger</name>
            <group>default</group>
            <description>Every 2 minutes</description>
            <job-name>BTriggerJob</job-name>
            <job-group>defaultGroup</job-group>
            <misfire-instruction>SmartPolicy</misfire-instruction>
            <!-- every 5mins -->
            <cron-expression>2 * * * * ?</cron-expression> 
        </cron>
    </trigger>

我一直在墙上撞了几个小时,所以任何帮助都非常感激。

1 个答案:

答案 0 :(得分:0)

我不熟悉&#34; XmlConfig&#34;任务。

但我看到两个问题。

您需要为命名空间添加别名并为xpath使用该别名&#34;选择&#34;。

我在下面展示了XmlPeek版本。注意我使用&#34; peanut&#34;,你可以使用你想要的任何别名。

请注意,查询现在有&#34;花生:&#34;在所有元素名称中。

<!-- you do not need a namespace for this example, but I left it in for future reference -->
<XmlPeek Namespaces="&lt;Namespace Prefix='peanut' Uri='http://quartznet.sourceforge.net/JobSchedulingData'/&gt;"
     XmlInputPath=".\Parameters.xml" 
     Query="//peanut:job-scheduling-data/peanut:schedule/peanut:trigger/peanut:cron/peanut:name[text()='ATrigger']/../..">
    <Output TaskParameter="Result" ItemName="Peeked" />
</XmlPeek>

注意我的&#34; ../.."

一旦找到正确的元素,找到它的父元素就像&#34; ..&#34;符号

您需要弄清楚如何将命名空间和别名添加到您的任务(XmlConfig)

APPEND:

http://sourceforge.net/p/wix/bugs/2384/

嗯......处理命名空间并不是一件容易的事。我认为你和那里的报道有类似的问题。

APPEND:

&#34;串联&#34;命名空间......(哎呀)

<XmlPeek
     XmlInputPath=".\Parameters.xml" 
     Query="//*[local-name()='job-scheduling-data' and namespace-uri()='http://quartznet.sourceforge.net/JobSchedulingData']/*[local-name()='schedule' and namespace-uri()='http://quartznet.sourceforge.net/JobSchedulingData']/*[local-name()='trigger' and namespace-uri()='http://quartznet.sourceforge.net/JobSchedulingData']/*[local-name()='cron' and namespace-uri()='http://quartznet.sourceforge.net/JobSchedulingData']/*[local-name()='name' and namespace-uri()='http://quartznet.sourceforge.net/JobSchedulingData'][text()='ATrigger']/../..">
    <Output TaskParameter="Result" ItemName="Peeked" />
</XmlPeek>

Aka,试试这个Xpath:

"//*[local-name()='job-scheduling-data' and namespace-uri()='http://quartznet.sourceforge.net/JobSchedulingData']/*[local-name()='schedule' and namespace-uri()='http://quartznet.sourceforge.net/JobSchedulingData']/*[local-name()='trigger' and namespace-uri()='http://quartznet.sourceforge.net/JobSchedulingData']/*[local-name()='cron' and namespace-uri()='http://quartznet.sourceforge.net/JobSchedulingData']/*[local-name()='name' and namespace-uri()='http://quartznet.sourceforge.net/JobSchedulingData'][text()='ATrigger']/../.."