LoadXml-根级别的数据无效。第1行,位置1

时间:2019-02-25 14:05:41

标签: regex xml vb.net

我有一个架构可以验证我的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值。任何帮助将非常感谢。

2 个答案:

答案 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验证数据