我有一个没有DOCTYPE声明的XML文件,我希望在阅读时使用外部DTD进行验证。
Dim x_set As Xml.XmlReaderSettings = New Xml.XmlReaderSettings()
x_set.XmlResolver = Nothing
x_set.CheckCharacters = False
x_set.ProhibitDtd = False
x = XmlTextReader.Create(sChemin, x_set)
如何设置外部DTD的路径?你如何验证?
答案 0 :(得分:15)
我以前成功使用过以下功能,应该很容易适应。然而,这依赖于创建一个XmlDocument作为magnifico提到。这可以通过以下方式实现:
XmlDocument doc = new XmlDocument();
doc.Load( filename );
doc.InsertBefore( doc.CreateDocumentType( "doc_type_name", null, DtdFilePath, null ),
doc.DocumentElement );
/// <summary>
/// Class to test a document against DTD
/// </summary>
/// <param name="doc">XML The document to validate</param>
private static bool ValidateDoc( XmlDocument doc )
{
bool isXmlValid = true;
StringBuilder xmlValMsg = new StringBuilder();
StringWriter sw = new StringWriter();
doc.Save( sw );
doc.Save( TestFilename );
XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
settings.ValidationType = ValidationType.DTD;
settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += new ValidationEventHandler( delegate( object sender, ValidationEventArgs args )
{
isXmlValid = false;
xmlValMsg.AppendLine( args.Message );
} );
XmlReader validator = XmlReader.Create( new StringReader( sw.ToString() ), settings );
while( validator.Read() )
{
}
validator.Close();
string message = xmlValMsg.ToString();
return isXmlValid;
}
答案 1 :(得分:1)
您可以使用所需的DTD创建Xml.XmlDocument,然后将XML文件数据附加到内存中的Xml.XmlDocument,然后验证吗?
答案 2 :(得分:-1)
private static bool _isValid = true;
static void Main(string[] args)
{
using (MemoryStream ms = new MemoryStream())
{
using (FileStream file = new FileStream("C:\\MyFolder\\Product.dtd", FileMode.Open, FileAccess.Read))
{
byte[] bytes = new byte[file.Length];
file.Read(bytes, 0, (int) file.Length);
ms.Write(bytes, 0, (int) file.Length);
}
using (FileStream file = new FileStream("C:\\MyFolder\\Product.xml", FileMode.Open, FileAccess.Read))
{
byte[] bytes = new byte[file.Length];
file.Read(bytes, 0, (int) file.Length);
ms.Write(bytes, 0, (int) file.Length);
}
ms.Position = 0;
var settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationType = ValidationType.DTD;
settings.ValidationEventHandler += new ValidationEventHandler(OnValidationEvent);
var reader = XmlReader.Create(ms, settings);
// Parse the file.
while (reader.Read()) ;
}
// Check whether the document is valid or invalid.
if (_isValid)
Console.WriteLine("Document is valid");
else
Console.WriteLine("Document is invalid");
}
private static void OnValidationEvent(object obj, ValidationEventArgs args)
{
_isValid = false;
Console.WriteLine("Validation event\n" + args.Message);
}