我有一个架构可以验证我的xml文件,但是我想进行进一步的验证,例如数字范围,生日结构。 DD / MM / YY不是mm / dd / yy。学生姓名允许使用特殊字符,例如。 _名称等
在我运行代码时,出现错误:
[错误]:根级别的数据无效。第1行,位于System.Xml.XmlTextReaderImpl.Throw(Exception e)处的位置1。
我的xml示例:
<?xml version="1.0" encoding="us-ascii" standalone="yes"?>
<studentTable xmlns="namespace">
<student>
<ID>0</ID>
<student_name>John</student_name>
<birthday>25/09/1997</birthday>
</student>
我尝试了以下代码,但收到错误“根级别的数据无效。System.Xml.XmlTextReaderImpl.Throw(Exception e)的行1,位置1”。
Dim xdoc As XmlDocument
Dim nodelist As XmlNodeList
Dim node As XmlNode
Dim ID, birthday, student_name As String
xdoc = New XmlDocument
xdoc.LoadXml("student2.xml")
nodelist = xdoc.SelectNodes("/studentTable/student")
For Each node In nodelist
ID = node.ChildNodes.Item(0).Attributes.GetNamedItem("ID").Value
birthday = node.ChildNodes.Item(1).Attributes.GetNamedItem("birthday").Value
student_name = node.ChildNodes.Item(2).Attributes.GetNamedItem("student_name").Value
Dim rgx As New Regex("^[0-9]*$")
If rgx.IsMatch(ID) = False Then
lstErrs.Add("Invalid ID number")
End If
Dim reg As New Regex("^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$")
If reg.IsMatch(birthday) = False Then
lstErrs.Add("Invalid birthday")
End If
Dim regx As New Regex("^[a-zA-Z]+(([',. -][a-zA-Z ])?[a-zA-Z]*)*$")
If regx.IsMatch(student_name) = False Then
lstErrs.Add("Invalid Name")
End If
Next
xml错误
If lstErrs.Count > 0 Then
'-- Output list of errors
MsgBox("Complete but with errors! Check error file.") '& vbCrLf & vbCrLf & Strings.Join(lstErrs.ToArray, vbCrLf))
fileWriter.WriteLine("Filename: " & strFilNme)
fileWriter.WriteLine(vbCrLf)
fileWriter.WriteLine("Errors:")
For i As Integer = 0 To lstErrs.Count - 1
fileWriter.WriteLine(lstErrs(i))
Next
Else
MsgBox("Complete!")
Exit Sub
End If
fileWriter.Close()
Catch ex As XmlSchemaValidationException
MsgBox("Complete but with errors! Check error file.")
fileWriter.WriteLine("[Error]: XmlSchemaValidationException -error!!!!!!")
fileWriter.WriteLine("LineNumber = {0}", ex.LineNumber)
fileWriter.WriteLine("LinePosition = {0}", ex.LinePosition)
fileWriter.WriteLine("Message = {0}", ex.Message)
fileWriter.WriteLine("Source = {0}", ex.Source)
Catch exOther As Exception
MsgBox("Complete but with errors! Check error file.")
fileWriter.WriteLine("[Error]: " & exOther.Message & exOther.StackTrace)
Finally
If Not IsNothing(reader) Then
reader.Close()
End If
If Not IsNothing(fileWriter) Then
fileWriter.Close()
End If
End Try
End Sub
Private Sub ValidationEventHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)
'MsgBox("Display Errors")
Select Case e.Severity
Case XmlSeverityType.Error
lstErrs.Add("Error: {0} " & e.Message)
Case XmlSeverityType.Warning
lstErrs.Add("Warning {0} " & e.Message)
Case Else
lstErrs.Add(e.Message)
End Select
End Sub
我尝试将LoadXml更改为仅加载,但是我的代码运行时没有错误,但是我的正则表达式未验证xml值。任何帮助将非常感谢。
答案 0 :(得分:0)
您知道,每个<ID>
节点中只有一个<birthday>
,<student>
等,您可以使用SelectSingleNode
。
尽管看起来.Value
可以为您带来看似有价值的东西,但它却比XmlNode Value vs InnerText更有趣。
我假设您输入xmlns="namespace"
是为了避免看到其他XML中的类似内容。在这种情况下,除非您实际使用它,否则只会使事情复杂化。
要验证日期,请使用DateTime.TryParseExact并为其提供格式字符串-无需使用复杂的正则表达式,如果您将其更改为更好的日期格式(例如yyyy-MM-dd),则该正则表达式将有所不同。
您最好在循环外声明正则表达式,以使循环内的代码保持整洁。
当消息中没有告诉您错误的数据在哪里或什么是错误的消息时,总是会感到沮丧,例如“日期错误”。
因此,此XML文件位于我的“ C:\ Temp”目录中(我不知道为什么您会使用“ us-ascii”而不是“ utf-8”):
<?xml version="1.0" encoding="us-ascii" standalone="yes"?>
<studentTable>
<student>
<ID>0q</ID>
<student_name>John*</student_name>
<birthday>25/109/1997</birthday>
</student>
</studentTable>
和此控制台应用程序:
Imports System.Text.RegularExpressions
Imports System.Xml
Module Module1
Sub Main()
Dim lstErrs As New List(Of String)
Dim idRegex = New Regex("^[0-9]*$")
Dim nameRegex = New Regex("^[a-zA-Z]+(([',. -][a-zA-Z ])?[a-zA-Z]*)*$")
Dim dateFormat = "d/M/yyyy"
Dim xdoc As New XmlDocument()
xdoc.Load("C:\Temp\students.xml")
Dim nodelist = xdoc.SelectNodes("//studentTable/student")
For Each node As XmlNode In nodelist
Dim id = node.SelectSingleNode("//ID").InnerText
Dim dob = node.SelectSingleNode("//birthday").InnerText
Dim name = node.SelectSingleNode("//student_name").InnerText
If Not idRegex.IsMatch(id) Then
lstErrs.Add("Invalid ID number " & id)
End If
If Not DateTime.TryParseExact(dob, dateFormat, Nothing, Nothing, New DateTime) Then
lstErrs.Add("Invalid birthday " & dob)
End If
If Not nameRegex.IsMatch(name) Then
lstErrs.Add("Invalid Name " & name)
End If
Console.WriteLine($"{id} {dob} {name}") '' for checking
Next
Console.WriteLine(String.Join(vbCrLf, lstErrs)) '' show the errors
Console.ReadLine()
End Sub
End Module
我得到以下输出:
0q 25/109/1997 John*
Invalid ID number 0q
Invalid birthday 25/109/1997
Invalid Name John*
答案 1 :(得分:-2)
在任何情况下都不要尝试使用正则表达式解析XML,除非您希望调用rite 666。 Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn。
使用XML解析库,请参见this page,以了解使用C#.Net进行解析的一些方法。这应该可以转换成vb.Net
编辑:在注释之后。尝试使用XML schema验证数据