我需要编写一段 C# 代码,以便在验证失败时从 XML 中提取属性信息。下面的代码能够为我提供验证失败的确切属性,但我还需要父节点中存在的属性的附加信息。
XML:
<Payload xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlVersion="1.0" createDate="2023-11-07T14:23:08" messageType="TEST">
<Orders>
<OrderHeader resultsIndicator="F" orderNumber="2000100" orderStatus="FIN" latestShipDate="4/23/2023 12:00:00 AM" cusNumber="791053" cusName="Apple, Ms.Rose" deliveryTerms="HOME" paymentType="AMEX" Destination="TX">
<OrderDetail resultsIndicator="F" lot="1234" sequence="01" invoice="FGD123401" finalDestination="75013" resultsMessage="DELIVERED" brandNumber="100141" brandName="LG">
<OrderCostingDetail expenseCode="ADMIN" expenseCategory="ADM" rate="2499.50" indicator="F" qualifier="SALE" unitCost="2499.50" level="002"/>
<OrderCostingDetail expenseCode="ADMIN" expenseCategory="ADM" rate="125.00" indicator="F" qualifier="SALE" unitCost="" level="002"/>
<OrderCostingDetail expenseCode="ADMIN" expenseCategory="ADM" rate="5879.20" indicator="F" qualifier="SALE" unitCost="5879.20" level="002"/>
</OrderDetail>
</OrderHeader>
<OrderHeader resultsIndicator="I" orderNumber="2000101" orderStatus="INIT" latestShipDate="12/10/2023 12:00:00 AM" cusNumber="56782" cusName="Roy, Mr.Ralph" deliveryTerms="HOME" paymentType="VISA" Destination="TX">
<OrderDetail resultsIndicator="I" lot="1234" sequence="01" invoice="FGD123401" finalDestination="75013" resultsMessage="DELIVERED" brandNumber="100141" brandName="LG">
<OrderCostingDetail expenseCode="ADMIN" expenseCategory="ADM" rate="24.00" indicator="I" qualifier="SALE" unitCost="24.00" level="004"/>
</OrderDetail>
</OrderHeader>
</Orders>
</Payload>
代码:
private static void PerformValidation(XmlTextReader xmlTextReader,
XmlSchemaSet schemas)
{
if (schemas == null)
{
throw new ArgumentNullException("schemas");
}
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas = schemas;
settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings; //sarul1
// settings.ValidationEventHandler += (sender, args) => error = ValidationCallback(sender, args);
string chkatt = string.Empty;
using (XmlReader reader = XmlReader.Create(xmlTextReader, settings))
{
try
{
do
{
chkatt = string.Concat("orderNo.: ",reader.GetAttribute("orderNumber"), ", Lot:", reader.GetAttribute("lot"), ", Seq:", reader.GetAttribute("sequence"));
} while (reader.Read()) ;
}
catch(Exception ex)
{
string error = ex.Message.ToString() + chkatt;
}
finally
{
reader.Close();
}
}
}
我在主函数中调用上述方法来根据预定义的模式验证是否存在 NULL 字段。我收到错误“‘unitCost’属性无效...字符串‘’不是有效的十进制值。”我需要向此消息添加其他属性信息,如 orderNumber、Lot 和 Sequence(在本例中为 orderNumber:2000100,Lot:1234,Seq:01),但我无法使用此代码实现。请帮助我前进!
PerformValidation
函数在错误消息中缺少上下文,因为它没有跟踪父节点中的属性值。
考虑这个更新的代码:
private static void PerformValidation(XmlTextReader xmlTextReader, XmlSchemaSet schemas)
{ if(模式 == null) { 抛出新的ArgumentNullException(“模式”); }
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas = schemas;
settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings;
string orderNumber = string.Empty;
string lot = string.Empty;
string sequence = string.Empty;
using (XmlReader reader = XmlReader.Create(xmlTextReader, settings))
{
try
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == "OrderHeader")
{
orderNumber = reader.GetAttribute("orderNumber");
}
else if (reader.Name == "OrderDetail")
{
lot = reader.GetAttribute("lot");
sequence = reader.GetAttribute("sequence");
}
}
else if (reader.NodeType == XmlNodeType.Attribute && reader.Value == string.Empty)
{
string errorMessage = $"Validation error in OrderNo.: {orderNumber}, Lot: {lot}, Seq: {sequence}. ";
errorMessage += $"Attribute '{reader.Name}' is invalid. The string '' is not a valid Decimal value.";
// Handle or log the error message as needed
Console.WriteLine(errorMessage);
}
}
}
catch (Exception ex)
{
string error = ex.Message.ToString();
// Handle or log the exception as needed
Console.WriteLine(error);
}
finally
{
reader.Close();
}
}
}
此代码引入了变量(订单编号、批次和序列)来存储这些值,以便在发生验证错误时提供更多信息丰富的错误消息。
尝试一下,如果需要进一步修改,请告诉我。 如果该答案解决了您的问题,请不要忘记标记为答案。 :)