Поскольку вы знаете, что в каждом <student>
узле есть только один <ID>
, <birthday>
и т. Д., Вы можете использовать SelectSingleNode
.
Хотя, похоже, .Value
даст вамто, что кажется значением, это более рискованно: Значение XmlNode против 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*