C# 读取 XML 带 DTD 验证
C# read XML with DTD verification
我正在尝试读取带有 dtd 验证的 XML 文件,但不知道我是怎么做的,程序似乎没有读取我的 dtd 文件。我已将问题集中到一个小的 xml 文件和一个小的 dtd 文件:
test.xml - 位于 c:\test.xml
<?xml version="1.0"?>
<!DOCTYPE Product SYSTEM "test.dtd">
<Product ProductID="123">
<ProductName>Rugby jersey</ProductName>
</Product>
test.dtd - 位于 c:\test.dtd
<!ELEMENT Product (ProductName)>
<!ATTLIST Product ProductID CDATA #REQUIRED>
<!ELEMENT ProductName (#PCDATA)>
我的 C# 程序是这样的
namespace XML_to_csv_converter
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
ReadXMLwithDTD();
}
public void ReadXMLwithDTD()
{
// Set the validation settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.DTD;
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
settings.IgnoreWhitespace = true;
// Create the XmlReader object.
XmlReader reader = XmlReader.Create("c:/test.xml", settings);
// Parse the file.
while (reader.Read())
{
System.Console.WriteLine("{0}, {1}: {2} ", reader.NodeType, reader.Name, reader.Value);
}
}
private static void ValidationCallBack(object sender, ValidationEventArgs e)
{
if (e.Severity == XmlSeverityType.Warning)
Console.WriteLine("Warning: Matching schema not found. No validation occurred." + e.Message);
else // Error
Console.WriteLine("Validation error: " + e.Message);
}
}
}
这导致输出:
XmlDeclaration, xml: version="1.0"
DocumentType, Product:
Validation error: The 'Product' element is not declared.
Element, Product:
Validation error: The 'ProductName' element is not declared.
Element, ProductName:
Text, : Rugby jersey
EndElement, ProductName:
EndElement, Product:
我尝试过将文件放在不同的位置,并且尝试了相对路径和绝对路径。我试图从微软网页上复制一个示例,结果出现了同样的问题。有人知道可能是什么问题?有什么方法可以查看程序是否能够加载 dtd 文件?
您需要添加解析器。
XmlReaderSettings settings = new XmlReaderSettings();
// SET THE RESOLVER
settings.XmlResolver = new XmlUrlResolver();
settings.ValidationType = ValidationType.DTD;
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
settings.IgnoreWhitespace = true;
只要这两个文件在同一个目录下,就可以了。
或者,您需要向 DTD 提供 URL。
XmlUrlResolver
也可以被覆盖以为解析过程提供额外的语义。
我无法发表评论,所以我将答案添加到 Jim 的正确答案中:
// SET THE RESOLVER
settings.XmlResolver = new XmlUrlResolver();
这是 .Net 4.5.1 和 Net 4.5.2 / .Net 4.6 之间的重大更改。解析器之前默认设置为 XmlUrlResolver。被这个坑了。
我正在尝试读取带有 dtd 验证的 XML 文件,但不知道我是怎么做的,程序似乎没有读取我的 dtd 文件。我已将问题集中到一个小的 xml 文件和一个小的 dtd 文件:
test.xml - 位于 c:\test.xml
<?xml version="1.0"?>
<!DOCTYPE Product SYSTEM "test.dtd">
<Product ProductID="123">
<ProductName>Rugby jersey</ProductName>
</Product>
test.dtd - 位于 c:\test.dtd
<!ELEMENT Product (ProductName)>
<!ATTLIST Product ProductID CDATA #REQUIRED>
<!ELEMENT ProductName (#PCDATA)>
我的 C# 程序是这样的
namespace XML_to_csv_converter
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
ReadXMLwithDTD();
}
public void ReadXMLwithDTD()
{
// Set the validation settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.DTD;
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
settings.IgnoreWhitespace = true;
// Create the XmlReader object.
XmlReader reader = XmlReader.Create("c:/test.xml", settings);
// Parse the file.
while (reader.Read())
{
System.Console.WriteLine("{0}, {1}: {2} ", reader.NodeType, reader.Name, reader.Value);
}
}
private static void ValidationCallBack(object sender, ValidationEventArgs e)
{
if (e.Severity == XmlSeverityType.Warning)
Console.WriteLine("Warning: Matching schema not found. No validation occurred." + e.Message);
else // Error
Console.WriteLine("Validation error: " + e.Message);
}
}
}
这导致输出:
XmlDeclaration, xml: version="1.0"
DocumentType, Product:
Validation error: The 'Product' element is not declared.
Element, Product:
Validation error: The 'ProductName' element is not declared.
Element, ProductName:
Text, : Rugby jersey
EndElement, ProductName:
EndElement, Product:
我尝试过将文件放在不同的位置,并且尝试了相对路径和绝对路径。我试图从微软网页上复制一个示例,结果出现了同样的问题。有人知道可能是什么问题?有什么方法可以查看程序是否能够加载 dtd 文件?
您需要添加解析器。
XmlReaderSettings settings = new XmlReaderSettings();
// SET THE RESOLVER
settings.XmlResolver = new XmlUrlResolver();
settings.ValidationType = ValidationType.DTD;
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
settings.IgnoreWhitespace = true;
只要这两个文件在同一个目录下,就可以了。 或者,您需要向 DTD 提供 URL。
XmlUrlResolver
也可以被覆盖以为解析过程提供额外的语义。
我无法发表评论,所以我将答案添加到 Jim 的正确答案中:
// SET THE RESOLVER settings.XmlResolver = new XmlUrlResolver();
这是 .Net 4.5.1 和 Net 4.5.2 / .Net 4.6 之间的重大更改。解析器之前默认设置为 XmlUrlResolver。被这个坑了。