并非所有 XML 文件在使用 xsd 验证时创建
Not all XML file creating while validating it with xsd
我创建了一个代码来为每条记录创建单独的 xml 文件,并且每个 XML 首先使用 XSD 文件进行验证,然后如果验证文件名 "validated" 追加,如果不是 "Not-validated" 追加。
我的代码是这样的---
============================================= ================================================ ======
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("yyyy-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 文件,并且每个 XML 首先使用 XSD 文件进行验证,然后如果验证文件名 "validated" 追加,如果不是 "Not-validated" 追加。
我的代码是这样的---
============================================= ================================================ ======
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("yyyy-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