2015-01-03 5 views
1

각 레코드와 각 XML에 대해 별도의 XML 파일을 만들 수있는 코드를 작성했습니다. 유효성 검사가 XSD 파일과 유효성 검사보다 파일 유효성 검사보다 "유효성이 확인되지 않음"이 아닌 경우 추가하십시오.xsd를 사용하여 유효성을 검사하는 동안 모든 XML 파일을 생성하는 중

내 코드 =================================== ---

이있다 ========================================================================================================== ================

class myprogram 
{ 
    public void GetAllXmlFiles(int CompanyId, int BranchId, int BookingId) 
    { 
     CompanyDataContext dc = new CompanyDataContext(); 
     var result = (from obj in dc.usp_Getjobdetail(CompanyId, BranchId, BookingId)//Procedure to get all record 
         select obj).ToList(); 
     if (result != null && result.Count > 0) 
     { 
      foreach (var item in result) 
      { 

       bool bIsValidated = true; 
       XDocument xdoc = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "JobXML\\JobTemplate.xml"); 

       //Code for setting XML node values and adding new XElement 
       //to create full xml file. 

       string sPayload = string.Empty; 

       XmlSchemaSet xschemas = new XmlSchemaSet(); 

       xschemas.Add("", AppDomain.CurrentDomain.BaseDirectory + "\\JOB-XML\\JOB.003.xsd"); 
       string sErrorMessage = ""; 

       xdoc.Validate(xschemas, (o, e) => 
       { 
        sErrorMessage = e.Message; 
        bIsValidated = false; 
       }); 
      // added code to pause current process for a sec 
       System.Threading.Thread.Sleep(1000); 
      // 
       sPayload = xdoc.ToString(); 

       string filename = @"C:\CAPS-XML\" + JobUpdate.JobNo + "-" + DateTime.Now.ToString("yyyy-MM-ddTHH-  mm-ss") + "-" + (bIsValidated == true ? "Validated" : "Not_Validated") + sErrorMessage + ".xml"; 

       if (!Directory.Exists(@"C:/CAPS-XML")) 
       { 
        Directory.CreateDirectory(@"C:/CAPS-XML"); 
        FileStream fStream = File.Create(filename); 
        fStream.Close(); 
        File.WriteAllText(filename, xdoc.ToString(), Encoding.UTF8); 
       } 
       else 
       { 

        FileStream fStream = File.Create(filename); 
        fStream.Close(); 
        File.WriteAllText(filename, xdoc.ToString(), Encoding.UTF8); 
       } 
      } 
     } 
    } 
} 

=========================== ========================================================================================================== ============================

현재이 코드에서 생성 된 모든 파일의 유효성은 입니다. 그러나 테스트 할 때 21 개의 레코드가 있으므로 폴더에 21 xml 파일이 있어야하지만 O를 만듭니다. nly 4하지만 사용시 중단 점을 사용하면 21 xml 파일이 모두 생성되므로 xsd로 내 xml의 유효성을 검사 한 코드 뒤에 잠시 현재의 스레드를 잠글 코드를 추가했습니다.

?
그리고이 문제에 대한 다른 해결책이 더 있다면 알려주십시오.

참고 : 죄송합니다. xml을 생성하는 코드를 제공 할 수 없습니다. 이 라인

+0

실제로이 방법은 윈도우 서비스에서 만든하지만 난 테스트 때 그래서 난 그냥이 코드 System.Threading.Thread.Sleep (1000)를 넣어 확인하는 동안, XML 디버거를 확인하는 동안 잠시 동안 일시 정지; 그냥 결과를 얻으려고. –

+0

감사합니다. 문제가 해결되었습니다. :-) –

답변

1

작성중인 파일 이름 :

string filename = @"C:\CAPS-XML\" 
       + JobUpdate.JobNo 
       + "-" 
       + DateTime.Now.ToString("yyyy-MM-ddTHH-  mm-ss") 
       + "-" 
       + (bIsValidated == true ? "Validated" : "Not_Validated") 
       + sErrorMessage 
       + ".xml"; 

JobUpdate.JobNo 같은

당신은 내가 안정적인 값을 가정 할 필요가 보여 코드에 있지 않습니다. 코드를 작동 시키거나 1000ms의 대기 시간을 추가하면 코드가 작동하므로 1 초를 기다리면이 파일이 고유하게 다시 변경되므로이 문제는이를 확인합니다.

고유하게 만들기 위해 파일 이름에 카운터를 추가하는 것이 좋습니다. 타임 스탬프에 밀리 초를 사용하면 코드가 20ms 내에 xml을 만들고 유효성을 검사 할 수있는 경우 충분하지 않을 수 있습니다. 개발자 박스에서 작동 할 수도 있지만 프로덕션 등급 하드웨어에서 코드를 실행하면 동일한 문제가 발생할 수 있습니다.

if (result != null && result.Count > 0) 
{ 
     int fileCounter = 0; 
     foreach (var item in result) 
     { 
      // all other code here 

      string filename = String.Format(@"C:\CAPS-XML\{0}-{1}-{2}{3}-{4}.xml" 
       , JobUpdate.JobNo 
       , DateTime.Now.ToString("yyyy-MM-ddTHH-  mm-ss") 
       , (bIsValidated == true ? "Validated" : "Not_Validated") 
       , sErrorMessage 
       , fileCounter); // this makes the file unique 

      fileCounter++; // add one 

      // create file code etc 
관련 문제