【发布时间】:2015-10-28 14:11:48
【问题描述】:
我有一个 VB.NET 函数,它可以验证我的 XML 与架构,如果失败,则将失败输出到 Web 服务的 XML 响应。
我遇到的问题是,当我说格式正确的 XML 时,它会验证并成功,然后如果我发送不正确的 XML,验证器会正确说明它在验证中失败的位置。
如果我通过 Web 服务发送格式正确的正确 XML,我的验证检查函数将返回与检查前一个 XML 时相同的错误,几乎就像它“缓存”了问题一样。
谁能告诉我为什么会这样,我可以确认通过验证的 XML 是 100% 正确的,因为我查看过它并导出到我在 VB.NET 之外验证 XML 的另一个程序。
我的 ValidateXML 函数
Public Shared Function ValidateXML(xmlFilePath As String) As String
Dim doc As New XmlDocument()
doc.LoadXml(xmlFilePath)
doc.Schemas.Add(Nothing, "http://www.fresh.co.uk/freshit/fresh_lead_schema.xsd")
Dim errorBuilder As New XmlValidationErrorBuilder()
doc.Validate(New ValidationEventHandler(AddressOf XmlValidationErrorBuilder.ValidationEventHandler))
FIGCloud.errorsText = XmlValidationErrorBuilder.GetErrors()
If FIGCloud.errorsText IsNot Nothing Then
'Throw New Exception(errorsText)
Return "Failed"
Else
Dim ReturnText As String = doc.InnerXml 'Returns XML Document as a String
Return ReturnText
End If
End Function
我从另一个来源获取的 XMLvalidationErrorBuilder 类
Public Class XmlValidationErrorBuilder
Public Shared _errors As New List(Of ValidationEventArgs)()
Public Shared Sub ValidationEventHandler(ByVal sender As Object, ByVal args As ValidationEventArgs)
If args.Severity = XmlSeverityType.Error Then
_errors.Add(args)
End If
End Sub
Public Shared Function GetErrors() As String
If _errors.Count <> 0 Then
Dim builder As New StringBuilder()
builder.Append("The following ")
builder.Append(_errors.Count.ToString())
builder.AppendLine(" error(s) were found while validating the XML document against the XSD:")
For Each i As ValidationEventArgs In _errors
builder.Append("* ")
builder.AppendLine(i.Message)
Next
Return builder.ToString()
Else
Return Nothing
End If
End Function
End Class
这是正确格式的 XML
<FreshLead>
<ContactDetails>
<Title>Mr</Title>
<FirstName>Joe</FirstName>
<LastName>Bloggs</LastName>
<EmailAddress>joe.bloggs@davisco.co.uk</EmailAddress>
<HomeTel>01527 321 850</HomeTel>
<MobileTel>07771111111</MobileTel>
<DateOfBirth>21/05/1987</DateOfBirth>
<Address>Joe Bloggs Road, Here</Address>
<Postcode>B98 9PA</Postcode>
</ContactDetails>
<TradeDetails>
<TradingName>Motor Trade Direct</TradingName>
<TypeOfBus>Sales</TypeOfBus>
<AgeOfBus>5 Years</AgeOfBus>
<NoOfEmployees>5</NoOfEmployees>
<NoOfDrivers>5</NoOfDrivers>
<FullPartTime>Full-Time</FullPartTime>
<BusPostcode>B98 9PA</BusPostcode>
<BusPremises>No</BusPremises>
<DemoCover>No</DemoCover>
<PremIndem>10000</PremIndem>
<RoadRisksIndem>20000</RoadRisksIndem>
<VolXS>250</VolXS>
<CoverStart>19/03/2015</CoverStart>
<CoverReq>Comprehensive</CoverReq>
<MTExperience>5 Years</MTExperience>
</TradeDetails>
<ProposerDetails>
<UKResident>5 Years</UKResident>
<FullUKLic>10 Years+</FullUKLic>
<MT.NCB>2 Years</MT.NCB>
<PC.NCB>2 Years</PC.NCB>
<ClaimsConv5yr>No</ClaimsConv5yr>
</ProposerDetails>
<AddDetails>
<CurrInsurer>Markerstudy</CurrInsurer>
<BestQuote>2000.00</BestQuote>
<ContactTime>Evening</ContactTime>
<PrefContact>Email</PrefContact>
</AddDetails>
第一次通过 Web 服务发送时验证正确。
我刚刚更改了 2 个字段,以便它们在“Int16”字段中包含“字符串”,然后失败(应该如此)这些字段是“Indem”字段。
<FreshLead>
<ContactDetails>
<Title>Mr</Title>
<FirstName>Joe</FirstName>
<LastName>Bloggs</LastName>
<EmailAddress>joe.bloggs@davisco.co.uk</EmailAddress>
<HomeTel>01527 321 850</HomeTel>
<MobileTel>07771111111</MobileTel>
<DateOfBirth>21/05/1987</DateOfBirth>
<Address>Joe Bloggs Road, Here</Address>
<Postcode>B98 9PA</Postcode>
</ContactDetails>
<TradeDetails>
<TradingName>Motor Trade Direct</TradingName>
<TypeOfBus>Sales</TypeOfBus>
<AgeOfBus>5 Years</AgeOfBus>
<NoOfEmployees>5</NoOfEmployees>
<NoOfDrivers>5</NoOfDrivers>
<FullPartTime>Full-Time</FullPartTime>
<BusPostcode>B98 9PA</BusPostcode>
<BusPremises>No</BusPremises>
<DemoCover>No</DemoCover>
<PremIndem>Over 10000</PremIndem>
<RoadRisksIndem>Over 20000</RoadRisksIndem>
<VolXS>250</VolXS>
<CoverStart>19/03/2015</CoverStart>
<CoverReq>Comprehensive</CoverReq>
<MTExperience>5 Years</MTExperience>
</TradeDetails>
<ProposerDetails>
<UKResident>5 Years</UKResident>
<FullUKLic>10 Years+</FullUKLic>
<MT.NCB>2 Years</MT.NCB>
<PC.NCB>2 Years</PC.NCB>
<ClaimsConv5yr>No</ClaimsConv5yr>
</ProposerDetails>
<AddDetails>
<CurrInsurer>Markerstudy</CurrInsurer>
<BestQuote>2000.00</BestQuote>
<ContactTime>Evening</ContactTime>
<PrefContact>Email</PrefContact>
</AddDetails>
但是当我将第一个工作示例传回时,它失败并出现与上述 XML 相同的错误,我已经在我的代码中提供了它验证的架构的位置,供任何希望使用工作示例和图形的人使用找出我哪里出错了。
谢谢
【问题讨论】:
标签: xml vb.net validation xsd