我不想做任何花哨的事情,我只想确保文档有效,如果不是,则打印错误信息。谷歌向我指出this,但似乎XmlValidatingReader已经过时了(至少,这是MonoDevelop告诉我的)。
编辑:我正在尝试Mehrdad的提示,但我遇到了麻烦。我想我已经掌握了大部分内容,但我无法在任何地方找到OnValidationEvent。我从哪里获得OnValidationEvent?
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.DTD;
settings.ValidationEventHandler += new ValidationEventHandler(/*trouble is here*/);
XmlReader validatingReader = XmlReader.Create(fileToLoad, settings);
答案 0 :(得分:4)
您应该构建一个合适的XmlValidatingReader
class,并将其作为参数传递给XmlReaderSettings
object,而不是直接创建XmlReader.Create
method:
var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD };
settings.ValidationEventHandler += new ValidationEventHandler(OnValidationEvent);
var reader = XmlReader.Create("file.xml", settings);
其余的没有改变。
P.S。 OnValidationEvent
是您声明用于处理验证事件的方法的名称。显然,如果您不想订阅由XmlReader
引发的验证事件,则可以删除该行。
答案 1 :(得分:2)
var messages = new StringBuilder();
var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD };
settings.ValidationEventHandler += (sender, args) => messages.AppendLine(args.Message);
var reader = XmlReader.Create("file.xml", settings);
if (messages.Length > 0)
{
// Log Validation Errors
// Throw Exception
// Etc.
}
答案 2 :(得分:0)
我已经在DTD验证中提到了这个示例。 https://docs.microsoft.com/en-us/dotnet/api/system.xml.xmlreadersettings.dtdprocessing?view=netcore-3.1#input
此示例包含无效的DTD XML,我已如下进行更正。
<!--XML file using a DTD-->
<!DOCTYPE store [
<!ELEMENT store (item)*>
<!ELEMENT item (name,dept,price)>
<!ATTLIST item type CDATA #REQUIRED ISBN CDATA
#REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT dept (#PCDATA)>
<!ELEMENT price (#PCDATA)>]>
<store>
<item type="supplies" ISBN="2-3631-4">
<name>paint</name>
<dept>1</dept>
<price>16.95</price>
</item>
</store>
答案 3 :(得分:-1)
完整描述:
在Visual Studio .NET中,创建一个新的Visual C#控制台应用程序
名为ValidateXml
的项目。在开头添加两个using语句
Class1.cs的内容如下:
using System.Xml; // for XmlTextReader and XmlValidatingReader
using System.Xml.Schema; // for XmlSchemaCollection (which is used later)
在Class1.cs
中,声明一个名为isValid
的布尔变量
开始Main
方法如下:
private static bool isValid = true; // If a validation error occurs,
// set this flag to false in the
// validation event handler.
创建一个XmlTextReader
对象以从文本中读取XML文档
文件在Main
方法中,然后创建XmlValidatingReader
验证此XML数据如下:
XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithDTD.xml");
XmlValidatingReader v = new XmlValidatingReader(r);
ValidationType
对象的XmlValidatingReader
属性
表示所需的验证类型(DTD,XDR或
架构)。将此属性设置为DTD,如下所示:
v.ValidationType = ValidationType.DTD;
如果发生任何验证错误,验证阅读器会生成一个
验证事件。添加以下代码以注册验证
事件处理程序(您将实现MyValidationEventHandler
步骤7)中的方法:
v.ValidationEventHandler +=
new ValidationEventHandler(MyValidationEventHandler);
添加以下代码以读取和验证XML文档。如果有的话
发生验证错误,调用MyValidationEventHandler
解决错误。此方法将isValid
设置为false(请参阅步骤8)。
您可以在验证后检查isValid
的状态,看看是否有
文件有效或无效。
while (v.Read())
{
// Can add code here to process the content.
}
v.Close();
// Check whether the document is valid or invalid.
if (isValid)
Console.WriteLine("Document is valid");
else
Console.WriteLine("Document is invalid");
在MyValidationEventHandler
方法之后写Main
方法
如下:
public static void MyValidationEventHandler(object sender,
ValidationEventArgs args)
{
isValid = false;
Console.WriteLine("Validation event\n" + args.Message);
}
构建并运行应用程序。应用程序应报告XML文档有效。
的 e.g:强>
在Visual Studio .NET中,修改ProductWithDTD.xml
以使其无效(例如,删除<AuthorName>M soliman</AuthorName>
元素)。
再次运行该应用程序。您应该收到以下错误消息:
Validation event
Element 'Product' has invalid content. Expected 'ProductName'.
An error occurred at file:///C:/MyFolder/ProductWithDTD.xml(4, 5).
Document is invalid