我一直在解决一个问题,试图验证 XML 文档及其关联的 DTD 文件。最初,我尝试转换(Micorsoft 文章)中的示例,然后通读另一篇 Stack-Overflow 文章(此处)中的帖子。在这两种情况下(有效和无效的 XML 文档),简单的 xml 文件都无法验证,我不知道为什么......
我的测试应用程序是一个 Windows Forms 项目,它有一个单一的表单,上面有几个按钮,下面的代码......
bool isValid = true;
StringBuilder xml = new StringBuilder();
StringBuilder messages = new StringBuilder();
string nl = Environment.NewLine;
public FormMain()
{
InitializeComponent();
}
private void ValidateProductXMLButton_Click(object sender, EventArgs e)
{
ValidateXML("ProductWithDTD.xml");
DisplayMessage();
}
private void ValidateItemXMLButton_Click(object sender, EventArgs e)
{
ValidateXML("ItemWithDTD.xml");
DisplayMessage();
}
private void DisplayMessage()
{
MessageBox.Show("XML is " + (isValid ? "" : "NOT ") + "valid" + nl + nl + "Message:" + nl + messages.ToString() + nl + nl + "XML" + nl + xml.ToString());
isValid = true;
messages = new StringBuilder();
xml = new StringBuilder();
}
protected void ValidateXML(string xmlFileName)
{
try
{
XmlReaderSettings xmlSettings = new XmlReaderSettings()
{
DtdProcessing = DtdProcessing.Parse,
ValidationType = ValidationType.DTD
};
xmlSettings.ValidationEventHandler += new ValidationEventHandler(ValidationCallback);
XmlReader reader = XmlReader.Create(AppDomain.CurrentDomain.BaseDirectory + xmlFileName, xmlSettings);
while (reader.Read())
{
// nothing to do, just validating the xml packet
xml.AppendLine(reader.ReadOuterXml());
}
reader.Close();
}
catch (Exception ex)
{
messages.AppendLine("ERROR : " + ex.Message);
isValid = false;
}
}
private void ValidationCallback(object sender, ValidationEventArgs e)
{
isValid = false;
messages.AppendLine(e.Message);
}
除了上面的代码,我的 2 个 XML 文件(一个有效,一个无效)和我的 DTD 文件的内容如下所示......
ProductWithDTD.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE Product SYSTEM "Product.dtd">
<Product ProductID="123">
<ProductName>Rugby jersey</ProductName>
</Product>
ItemWithDTD.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE Product SYSTEM "Product.dtd">
<Item ItemID="123">
<ItemName>Rugby jersey</ItemName>
</Item>
最后,Product.dtd...
<!ELEMENT Product (ProductName)>
<!ATTLIST Product ProductID CDATA #REQUIRED>
<!ELEMENT ProductName (#PCDATA)>
即使在处理 ProductWithDTD.xml 文件时,我也会收到验证错误,指出未声明 Product 和 ProductName 元素。我希望这在 ItemWithDTD.xml 文件中,而不是 ProductWithDTD.xml 文件中。
有谁知道为什么这会失败?这一切都是为验证 cXML EDI 数据包做准备(这也不起作用),它们是要验证的更大的文档。
谢谢。