C# 并非所有XML文件都是在使用xsd进行验证时创建的
我已经创建了一个代码,为每个记录创建单独的xml文件,每个xml首先使用XSD文件进行验证,如果在文件名“Validated”append中进行了验证,那么创建的文件将比“not Validated”append中的文件更有效 我的密码是--- =====================================================================================================C# 并非所有XML文件都是在使用xsd进行验证时创建的,c#,xsd-validation,C#,Xsd Validation,我已经创建了一个代码,为每个记录创建单独的xml文件,每个xml首先使用XSD文件进行验证,如果在文件名“Validated”append中进行了验证,那么创建的文件将比“not Validated”append中的文件更有效 我的密码是--- ===================================================================================================== class myprogram { pub
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);
}
}
}
}
}
=====================================================================================================
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的代码。您正在使用此行创建文件名:
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(“yyy-MM-ddTHH-MM-ss”)
发生更改,从而使文件再次唯一
我建议您在文件名中添加一个计数器,使其唯一。如果您的代码能够在20毫秒内创建和验证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
实际上,这个方法是在一个窗口服务中创建的,但当我在测试时,验证XML时,调试器在验证时暂停了一段时间,所以我把这个代码放在System.Threading.Thread.Sleep(1000)中;只是为了得到结果。谢谢rene,问题解决了。:-)