使用xsd验证时,并非创建所有XML文件

时间:2015-01-03 12:26:32

标签: c# xsd-validation

我创建了一个代码来为每条记录创建单独的xml文件,并且每个XML首先使用XSD文件验证,而不是在验证时创建的文件,而不是在文件名和#34;验证的#34;追加,如果不是"未经验证"追加。

我的代码就是这个---

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

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文件,但它只创建了4个,但是当它使用断点时会创建所有21个xml文件,所以我 在我使用xsd

验证我的xml的代码之后添加代码以暂停当前线程一秒钟

所以,任何人都可以告诉我为什么会这样吗? 如果可能有任何其他更好的解决方案,请告诉我。

注意:抱歉,但我无法提供创建xml的代码。

1 个答案:

答案 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不在您显示的代码中,我必须假设它是一个稳定的值。如果您的代码有效,或者添加1000毫秒的等待时间,则解决此问题会验证这一点,因为等待1秒会使此DateTime.Now.ToString("yyyy-MM-ddTHH- mm-ss")更改,从而使文件再次成为唯一。

我建议您在文件名中添加一个计数器,使其独一无二。如果您的代码能够在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