首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试用XDT和XPath定位器替换XML元素

尝试用XDT和XPath定位器替换XML元素
EN

Stack Overflow用户
提问于 2014-03-14 19:59:04
回答 3查看 3.6K关注 0票数 4

嗨,我正在尝试使用<cron-expression> XDT替换VS2012,方法是在quartz.net作业描述文件上使用下面的转换。我已经使用在线测试器测试了XPath定位器,它返回了“我认为我需要的东西”。任何帮助都是非常感谢的。

代码语言:javascript
复制
<schedule>
    <trigger>
        <cron xdt:Locator="XPath(//job-scheduling-data/schedule/trigger/cron[name='crontriggername2'])" >
            <cron-expression  xdt:Transform="Replace">***some data***</cron-expression>
        </cron>
    </trigger>
</schedule>

用于示例XML文件(Quartz.net)

代码语言:javascript
复制
  <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"><processing-directives>
    <overwrite-existing-data>true</overwrite-existing-data>
</processing-directives>

<schedule>
       <trigger>
        <cron>
            <name>crontriggername1</name>
            <group>crontriggergroup1</group>
            <description>crontriggerdesc1</description>
            <job-name>crontriggerjobname1</job-name>
            <job-group>crontriggerjgroup1</job-group>
            <misfire-instruction>crontriggermisfile1</misfire-instruction>
            <cron-expression>0/5 * * * * ?</cron-expression>
        </cron>
    </trigger>

    <trigger>
        <cron>
            <name>crontriggername2</name>
            <group>crontriggergroup2</group>
            <description>crontriggerdesc2</description>
            <job-name>crontriggerjobname2</job-name>
            <job-group>crontriggerjgroup2</job-group>
            <misfire-instruction>crontriggermisfile2</misfire-instruction>
            <cron-expression>0/13 * * * * ?</cron-expression>
        </cron>
    </trigger>      
</schedule>

//job-scheduling-data/schedule/trigger/cronname='crontriggername2‘XPath

返回正确的元素组(http://www.freeformatter.com/xpath-tester.html1)

代码语言:javascript
复制
<cron>
  <name>crontriggername2</name>
  <group>crontriggergroup2</group>
  <description>crontriggerdesc2</description>
  <job-name>crontriggerjobname2</job-name>
  <job-group>crontriggerjgroup2</job-group>
  <misfire-instruction>crontriggermisfile2</misfire-instruction>
  <cron-expression>0/13 * * * * ?</cron-expression>
</cron>

这个表达式基于Log4net (log4Net config transform)上另一个XDT公式的解。

有人能告诉我一个正确的解决办法吗,这让我发疯了。提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-22 23:43:01

另一个不需要对原始文件进行任何修改的解决方案是

代码语言:javascript
复制
<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<schedule>
    <trigger>


        <cron xdt:Locator="XPath(//*[local-name()='job-scheduling-data']
                                 /*[local-name()='schedule']
                                 /*[local-name()='trigger']
                                 /*[local-name()='cron']
                                   [*[local-name() = 'name'] = 'MyTriggerName'])">

or this syntax...

        <cron xdt:Locator="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'] = 'MyTriggerName'])">

            <cron-expression  xdt:Transform="Replace">***some data***</cron-expression>
        </cron>
    </trigger>
</schedule>

另见I am trying to get the Xpath for a value but getting error for nested condition

票数 5
EN

Stack Overflow用户

发布于 2014-08-01 12:37:41

将名称空间别名应用于转换文件中的石英命名空间(可以将其保留为原始作业配置文件中的默认名称空间),并在所有石英节点(包括XPath内部)上使用该别名。此外,您可以使用Condition而不是XPath,因此只能指定相对于当前节点的表达式的XPath表达式的部分。

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<q:job-scheduling-data xmlns:q="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <q:schedule>
        <q:trigger>
            <q:cron xdt:Locator="Condition(q:name='crontriggername2')" >
                <q:cron-expression xdt:Transform="Replace">***some data***</q:cron-expression>
            </q:cron>
        </q:trigger>
    </q:schedule>
</q:job-scheduling-data>
票数 4
EN

Stack Overflow用户

发布于 2014-03-14 20:26:09

这是因为您的XML具有默认名称空间(http://quartznet.sourceforge.net/JobSchedulingData)。

我对XDT一无所知,所以我不确定是否有一种简单的方法来声明名称空间,但是尝试搜索"xdt xpath默认名称空间“。

同时,这里有一个使用local-name()的详细选项,应该可以工作.

代码语言:javascript
复制
XPath(//*[local-name()='job-scheduling-data']/*[local-name()='schedule']/*[local-name()='trigger']/*[local-name()='cron' and *[local-name()='name']='crontriggername2'])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22414628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档