没有正确读取xml节点 [英] Not reading the xml nodes properly

查看:98
本文介绍了没有正确读取xml节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了一个脚本,假设将假期与xml文件中的假期进行比较,我不知道为什么它没有考虑假期。它在假期假期结束休假制度时,会在休假日创建工作日志。我的脚本和我的xml文件代码都可以在下面看到:

XML:

 <假日> 
< holiday type =fixedname =New year's daydate =01 / Janduration_seconds =1d/>
< holiday type =fixedname =Christmas daydate =25 / Decduration_seconds =1d/>
< holiday type =floatingname =Labor daydate =04 / Sep / 17duration_seconds =1d/>
< holiday type =floatingname =感恩节date =09 / Oct / 17duration_seconds =1d/>
< /节假日>

脚本:

  import com.onresolve.scriptrunner.runner.ScriptRunnerImpl; 
import com.onresolve.scriptrunner.runner.customisers.PluginModule;
import com.onresolve.scriptrunner.runner.customisers.WithPlugin;
import com.atlassian.jira.issue.CustomFieldManager;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.issue.IssueManager;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.issue.customfields.manager.OptionsManager
import com.onresolve.scriptrunner.runner.ScriptRunnerImpl
import com.onresolve.scriptrunner.runner.customisers.PluginModule
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import java.lang.Object
import com.atlassian.jira.issue.worklog.WorklogImpl2
import java.text.SimpleDateFormat
import com.atlassian.crowd.embedded.api.User
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.worklog.DefaultWorklogManager
import com.atlassian.jira.security.roles.ProjectRoleManager
import com.atlassian.jira.issue.worklog.Worklog
import com.atlassian.jira.datetime.LocalDate
import org.apache .commons.lang.RandomStringUtils
导入groovy.xml.MarkupBuilder
导入groovy.util。*
导入groovy.xml.MarkupBuilder
导入javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath。*
import org.w3c.dom.Document
import org.w3c.dom.Element
import org.w3c.dom.NodeList

$ b $ def componentManager = ComponentManager.getInstance()
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def cfend = customFieldManager.getCustomFieldObjectByName(End Date)
def cfstart = customFieldManager.getCustomFieldObjectByName(Start Date)
def cfdays = customFieldManager.getCustomFieldObjectByName(used vacation
days)
def reporter = issue.reporter.name
def worklogManager = ComponentAccessor.getWorklogManager();

String f = new File('/ var / atlassian / application-
data / jira_7.3.1 / import / holidays.xml')

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(f);
doc.getDocumentElement()。normalize();

//将自定义字段的日期对象更改为天数
int days =(issue.getCustomFieldValue(cfdays)as int)//返回数字
天数


ProjectRoleManager projectRoleManager =
ComponentManager.getComponentInstanceOfType(ProjectRoleManager.class)作为
ProjectRoleManager
def UsersRole = projectRoleManager.getProjectRole(Users)
long timespent = 27000
int counter = 0;
int check = 0;

for(int i = 0; check == 0; i ++){
String hd = null;
int c2 = 0;
int c = 0;
NodeList nodeLst = doc.getElementsByTagName(holiday);
int d1 =((issue.getCustomFieldValue(cfstart)as Date)+
i).getDate()
int m1 =((issue.getCustomFieldValue(cfstart)as Date)+
i).getMonth()
$ b $ if if(m1 == 0)
hd = d1 +/ Jan
else if(m1 == 1)
hd = d1 +/ Feb
else if(m1 == 2)
hd = d1 +/ March
else if(m1 == 3)
hd = d1 +/ Apr
else if(m1 == 4)
hd = d1 +/ May
else if(m1 == 5)
hd = d1 +/ Jun
else if(m1 == 6)
hd = d1 +/ Jul
else if(m1 == 7)
hd = d1 +/ Aug
else if( m1 == 8)
hd = d1 +/ Sep
else if(m1 == 9)
hd = d1 +/ Oct
else if(m1 == 10 )
hd = d1 +/ Nov
else {
hd = d1 +/ Dec
}

for(int j = 0; j < nodeLst.getLength() - 1; j ++){
c = 0
元素dateEle ment =(Element)nodeLst.item(j)
String hd2 =
dateElement.getAttributes()。getNamedItem(date)。getNodeValue()
for(int k = 0; k hd [k] == hd2 [k]
c ++
if(c == hd.length())
c2 = 1;


$ b //如果日期是假期
if(c2 == 1){}

//检查如果是星期日
else if(((issue.getCustomFieldValue(cfstart)as Date)+ i).getDay()== 0){
}
//检查它是否是星期六
else if(((issue.getCustomFieldValue(cfstart)as Date)+ i).getDay()== 6){
}
//本周的任何其他日子
else {
def worklog = new WorklogImpl2(issue,null,issue.reporter.name,
issue.summary,(issue.getCustomFieldValue(cfstart)as Date)+ i,null,
null,timespent,UsersRole)
worklogManager.create(issue.reporter,worklog,0L,true)
counter ++
}

if(days == counter){
check = 1;
}
}

return 0;

我知道开始日期是从字段中提取的,我知道xml文件已被识别。我只是不知道它是否从xml文件中提取假期日期,或者如果我的逻辑存在问题。 解决方案

对不起,如果我浪费了任何时间。我得到它的工作,这只是一个逻辑错误。如果有人需要这个脚本,它可以用于JIRA的Scriptrunner来创建工作日志,避免周末和假期。这会从文件中提取假日列表。

  import com.onresolve.scriptrunner.runner.ScriptRunnerImpl; 
import com.onresolve.scriptrunner.runner.customisers.PluginModule;
import com.onresolve.scriptrunner.runner.customisers.WithPlugin;
import com.atlassian.jira.issue.CustomFieldManager;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.issue.IssueManager;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.issue.customfields.manager.OptionsManager
import com.onresolve.scriptrunner.runner.ScriptRunnerImpl
import com.onresolve.scriptrunner.runner.customisers.PluginModule
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import java.lang.Object
import com.atlassian.jira.issue.worklog.WorklogImpl2
import java.text.SimpleDateFormat
import com.atlassian.crowd.embedded.api.User
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.worklog.DefaultWorklogManager
import com.atlassian.jira.security.roles.ProjectRoleManager
import com.atlassian.jira.issue.worklog.Worklog
import com.atlassian.jira.datetime.LocalDate
import org.apache .commons.lang.RandomStringUtils
导入groovy.xml.MarkupBuilder
导入groovy.util。*
导入groovy.xml.MarkupBuilder
导入javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath。*
import org.w3c.dom.Document
import org.w3c.dom.Element
import org.w3c.dom.NodeList

$ b $ def componentManager = ComponentManager.getInstance()
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def cfend = customFieldManager.getCustomFieldObjectByName(End Date)
def cfstart = customFieldManager.getCustomFieldObjectByName(Start Date)
def cfdays = customFieldManager.getCustomFieldObjectByName(used vacation
days)
def reporter = issue.reporter.name
def worklogManager = ComponentAccessor.getWorklogManager();

String f = new File('/ var / atlassian / application-
data / jira_7.3.1 / import / holidays.xml')

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(f);
doc.getDocumentElement()。normalize();

//取自定义字段的日期对象并将其更改为天数
int days =(issue.getCustomFieldValue(cfdays)as int)//返回
天数


ProjectRoleManager projectRoleManager =
ComponentManager.getComponentInstanceOfType(ProjectRoleManager.class)作为
ProjectRoleManager
def UsersRole = projectRoleManager.getProjectRole(Users)
long timespent = 27000
int counter = 0;
int check = 0;

for(int i = 0; check == 0; i ++){
String hd = null;
int c2 = 0;
int c = 0;
NodeList nodeLst = doc.getElementsByTagName(holiday);
int d1 =((issue.getCustomFieldValue(cfstart)as Date)+
i).getDate()
int m1 =((issue.getCustomFieldValue(cfstart)as Date)+
i).getMonth()
$ b $ if if(m1 == 0)
hd = d1 +/ Jan
else if(m1 == 1)
hd = d1 +/ Feb
else if(m1 == 2)
hd = d1 +/ Mar
else if(m1 == 3)
hd = d1 +/ Apr
else if(m1 == 4)
hd = d1 +/ May
else if(m1 == 5)
hd = d1 +/ Jun
else if(m1 == 6)
hd = d1 +/ Jul
else if(m1 == 7)
hd = d1 +/ Aug
else if( m1 == 8)
hd = d1 +/ Sep
else if(m1 == 9)
hd = d1 +/ Oct
else if(m1 == 10 )
hd = d1 +/ Nov
else {
hd = d1 +/ Dec
}

for(int j = 0; j< nodeLst.getLength() - 1; (元素)nodeLst.item(j)
String hd2 =
dateElement.getAttributes()。getNamedItem(date)。getNodeValue ()

for(int k = 0; k if(hd2 [0] ==0){
if(hd [k] == hd2 [k + 1]){
c ++
}
}
else {
if(hd [k] ==如果(c == hd.length() - 1)
c2 = 1; hd2 [k]){
c ++
}
}
;


$ b //如果日期是假期
if(c2 == 1){}

//检查如果是星期日
else if(((issue.getCustomFieldValue(cfstart)as Date)+ i).getDay()
== 0){
}
// Checks如果是星期六
else if(((issue.getCustomFieldValue(cfstart)as Date)+ i).getDay()==
6){
}
// Any本周其他日
else {
def worklog = new WorklogImpl2(issue,null,issue.reporter.name,
issue.summary,(issue.getCustomFieldValue(cfstart)as Date)+
worklogManager.create(issue.reporter,worklog,0L,true)
counter ++
}


null,null,timespent,UsersRole) if(days == counter){
check = 1;
}
}

return 0;


I wrote a script that is suppose to compare the vacation days with the hoidays which is taken by a xml file, I don't know why it is not considering the holiday. It creates work-logs on a vacation day when it is suppose to go over the vacation system. Both my script and my xml file code can be seen below:

XML:

<holidays>
   <holiday type="fixed" name="New year's day" date="01/Jan" duration_seconds="1d"/>
   <holiday type="fixed" name="Christmas day" date="25/Dec" duration_seconds="1d"/>
   <holiday type="fixed" name="Boxing day" date="26/Dec" duration_seconds="1d"/>
   <holiday type="floating" name="Family Day" date="20/Feb/17" duration_seconds="1d"/>
   <holiday type="floating" name="Good Friday" date="14/Apr/17" duration_seconds="1d"/>
   <holiday type="floating" name="CENGN Easter day off (only in 2017)" date="17/Apr/17" duration_seconds="1d"/>
   <holiday type="floating" name="Victoria Day" date="22/May/17" duration_seconds="1d"/>
   <holiday type="floating" name="Canada day" date="03/Jul/17" duration_seconds="1d"/>
   <holiday type="floating" name="Civic Holiday" date="07/Aug/17" duration_seconds="1d"/>
   <holiday type="floating" name="Labor day" date="04/Sep/17" duration_seconds="1d"/>
   <holiday type="floating" name="Thanksgiving day" date="09/Oct/17" duration_seconds="1d"/>
</holidays>   

SCRIPT:

  import com.onresolve.scriptrunner.runner.ScriptRunnerImpl;
  import com.onresolve.scriptrunner.runner.customisers.PluginModule;
  import com.onresolve.scriptrunner.runner.customisers.WithPlugin;
  import com.atlassian.jira.issue.CustomFieldManager;
  import com.atlassian.jira.issue.fields.CustomField;
  import com.atlassian.jira.ComponentManager
  import com.atlassian.jira.issue.IssueManager;
  import com.atlassian.jira.issue.Issue;
  import com.atlassian.jira.issue.MutableIssue;
  import com.atlassian.jira.issue.customfields.manager.OptionsManager
  import com.onresolve.scriptrunner.runner.ScriptRunnerImpl
  import com.onresolve.scriptrunner.runner.customisers.PluginModule
  import com.onresolve.scriptrunner.runner.customisers.WithPlugin
  import java.lang.Object
  import com.atlassian.jira.issue.worklog.WorklogImpl2
  import java.text.SimpleDateFormat
  import com.atlassian.crowd.embedded.api.User
  import com.atlassian.jira.component.ComponentAccessor
  import com.atlassian.jira.issue.worklog.DefaultWorklogManager
  import com.atlassian.jira.security.roles.ProjectRoleManager
  import com.atlassian.jira.issue.worklog.Worklog
  import com.atlassian.jira.datetime.LocalDate
  import org.apache.commons.lang.RandomStringUtils
  import groovy.xml.MarkupBuilder 
  import groovy.util.*
  import groovy.xml.MarkupBuilder
  import javax.xml.parsers.DocumentBuilder;
  import javax.xml.parsers.DocumentBuilderFactory;
  import javax.xml.xpath.*
  import org.w3c.dom.Document
  import org.w3c.dom.Element
  import org.w3c.dom.NodeList


  def componentManager = ComponentManager.getInstance()
  def customFieldManager = ComponentAccessor.getCustomFieldManager()
  def cfend = customFieldManager.getCustomFieldObjectByName("End Date")
  def cfstart = customFieldManager.getCustomFieldObjectByName("Start Date")
  def cfdays = customFieldManager.getCustomFieldObjectByName("Used vacation 
  days")
  def reporter = issue.reporter.name
  def worklogManager = ComponentAccessor.getWorklogManager();

  String f = new File('/var/atlassian/application-
  data/jira_7.3.1/import/holidays.xml')

  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  DocumentBuilder db = dbf.newDocumentBuilder();
  Document doc = db.parse(f);
  doc.getDocumentElement().normalize();

  //Take customfield date object and change it to days
  int days = (issue.getCustomFieldValue(cfdays) as int)//return the number 
  of days


  ProjectRoleManager projectRoleManager = 
  ComponentManager.getComponentInstanceOfType(ProjectRoleManager.class) as 
  ProjectRoleManager
  def UsersRole = projectRoleManager.getProjectRole("Users")
  long timespent = 27000
  int counter = 0;
  int check = 0;

    for(int i=0; check == 0 ;i++){
        String hd = null;
        int c2 =0;
        int c =0;
        NodeList nodeLst = doc.getElementsByTagName("holiday");
        int d1 = ((issue.getCustomFieldValue(cfstart) as Date) + 
        i).getDate()
        int m1 = ((issue.getCustomFieldValue (cfstart) as Date) + 
        i).getMonth()

        if(m1 == 0)
            hd = d1+"/Jan"
    else if(m1 == 1)
           hd = d1+"/Feb"
    else if(m1 == 2)
           hd = d1+"/March"
    else if(m1 == 3)
           hd = d1+"/Apr"
    else if(m1 == 4)
           hd = d1+"/May"
    else if(m1 == 5)
           hd = d1+"/Jun"
    else if(m1 == 6)
           hd = d1+"/Jul"
    else if(m1 == 7)
           hd = d1+"/Aug"
    else if(m1 == 8)
           hd = d1+"/Sep"
    else if(m1 ==9)
           hd = d1+"/Oct"
    else if(m1 == 10)
           hd = d1+"/Nov"
    else{
           hd = d1+"/Dec"
    }

    for (int j = 0; j < nodeLst.getLength()-1; j++){
        c=0
        Element dateElement = (Element) nodeLst.item(j)
        String hd2 = 
        dateElement.getAttributes().getNamedItem("date").getNodeValue()
        for(int k =0; k<hd.length()-1;k++){
            hd[k]==hd2[k]
            c++
            if (c==hd.length())
                c2 = 1;
        }

}
           //If the date is a holiday
            if(c2 ==1){}

          //Checks if it is sunday
  else if(((issue.getCustomFieldValue(cfstart) as Date) + i).getDay() == 0){
}
          //Checks if it is Saturday
else if(((issue.getCustomFieldValue(cfstart) as Date) + i).getDay() == 6){
}  
         //Any other day in the week     
else{
    def worklog = new WorklogImpl2(issue, null, issue.reporter.name, 
    issue.summary, (issue.getCustomFieldValue(cfstart) as Date) + i, null, 
    null,timespent, UsersRole)
             worklogManager.create(issue.reporter, worklog, 0L, true)
             counter++
}

     if(days == counter){
         check =1;
     }
 }

  return 0;

I know that the start date is being pulled from a field and I know that the xml file is recognized. I just don't know if its pulling the holiday dates from the xml file or if there is a problem with my logic

解决方案

sorry if I wasted anybodies time. I got it to work, it was just a logical mistake. Incase anybody needs this script, it can be used in Scriptrunner for JIRA to create worklogs that avoid weekends and holidays. This pulls the holiday list from a file.

import com.onresolve.scriptrunner.runner.ScriptRunnerImpl;
import com.onresolve.scriptrunner.runner.customisers.PluginModule;
import com.onresolve.scriptrunner.runner.customisers.WithPlugin;
import com.atlassian.jira.issue.CustomFieldManager;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.issue.IssueManager;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.issue.customfields.manager.OptionsManager
import com.onresolve.scriptrunner.runner.ScriptRunnerImpl
import com.onresolve.scriptrunner.runner.customisers.PluginModule
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import java.lang.Object
import com.atlassian.jira.issue.worklog.WorklogImpl2
import java.text.SimpleDateFormat
import com.atlassian.crowd.embedded.api.User
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.worklog.DefaultWorklogManager
import com.atlassian.jira.security.roles.ProjectRoleManager
import com.atlassian.jira.issue.worklog.Worklog
import com.atlassian.jira.datetime.LocalDate
import org.apache.commons.lang.RandomStringUtils
import groovy.xml.MarkupBuilder 
import groovy.util.*
import groovy.xml.MarkupBuilder
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*
import org.w3c.dom.Document
import org.w3c.dom.Element
import org.w3c.dom.NodeList


def componentManager = ComponentManager.getInstance()
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def cfend = customFieldManager.getCustomFieldObjectByName("End Date")
def cfstart = customFieldManager.getCustomFieldObjectByName("Start Date")
def cfdays = customFieldManager.getCustomFieldObjectByName("Used vacation 
days")
def reporter = issue.reporter.name
def worklogManager = ComponentAccessor.getWorklogManager();

String f = new File('/var/atlassian/application-
data/jira_7.3.1/import/holidays.xml')

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(f);
doc.getDocumentElement().normalize();

//Take customfield date object and change it to days
int days = (issue.getCustomFieldValue(cfdays) as int)//return the number of 
days


ProjectRoleManager projectRoleManager = 
ComponentManager.getComponentInstanceOfType(ProjectRoleManager.class) as 
ProjectRoleManager
def UsersRole = projectRoleManager.getProjectRole("Users")
long timespent = 27000
int counter = 0;
int check = 0;

     for(int i=0; check == 0 ;i++){
         String hd = null;
         int c2 =0;
         int c =0;
         NodeList nodeLst = doc.getElementsByTagName("holiday");
         int d1 = ((issue.getCustomFieldValue(cfstart) as Date) + 
         i).getDate()
         int m1 = ((issue.getCustomFieldValue (cfstart) as Date) + 
         i).getMonth()

         if(m1 == 0)
              hd = d1+"/Jan"
         else if(m1 == 1)
              hd =d1+"/Feb"
         else if(m1 == 2)
              hd = d1+"/Mar"
         else if(m1 == 3)
              hd = d1+"/Apr"
         else if(m1 == 4)
              hd = d1+"/May"
         else if(m1 == 5)
              hd = d1+"/Jun"
         else if(m1 == 6)
              hd = d1+"/Jul"
         else if(m1 == 7)
              hd = d1+"/Aug"
         else if(m1 == 8)
              hd = d1+"/Sep"
         else if(m1 ==9)
              hd = d1+"/Oct"
         else if(m1 == 10)
              hd = d1+"/Nov"
         else{
              hd = d1+"/Dec"
         }

         for (int j = 0; j < nodeLst.getLength()-1; j++){
             c=0
             Element dateElement = (Element) nodeLst.item(j)
             String hd2 = 
             dateElement.getAttributes().getNamedItem("date").getNodeValue()

             for(int k =0; k<hd.length()-1;k++){
                 if(hd2[0]=="0"){
                     if(hd[k]==hd2[k+1]){
                         c++
                     }
                  }
                 else{
                     if(hd[k]==hd2[k]){
                         c++
                     }
                 }
                 if (c==hd.length()-1)
                     c2 = 1;
             }

     }
        //If the date is a holiday
       if(c2 ==1){}

       //Checks if it is sunday
       else if(((issue.getCustomFieldValue(cfstart) as Date) + i).getDay() 
       == 0){
       }
      //Checks if it is Saturday
      else if(((issue.getCustomFieldValue(cfstart) as Date) + i).getDay() == 
      6){
      }  
 //Any other day in the week     
     else{
         def worklog = new WorklogImpl2(issue, null, issue.reporter.name, 
         issue.summary, (issue.getCustomFieldValue(cfstart) as Date) + i, 
         null,null,timespent, UsersRole)
         worklogManager.create(issue.reporter, worklog, 0L, true)
         counter++
     }

     if(days == counter){
         check =1;
     }
}

return 0;

这篇关于没有正确读取xml节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆