"Элемент 'html' не объявлен."в XmlValidatingReader - PullRequest
1 голос
/ 13 декабря 2011

У меня есть этот HTML-документ:

    <?xml version="1.0" encoding="utf-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form class="Form" onsubmit="return checkForm(this);" id="Form" method="post">
//form body
</form>
</body>
</html>

Это трассировка стека:

в System.Xml.XmlValidatingReaderImpl.ValidationEventHandling.System.Xml.IValidationEventHandling.SendEvent (Исключениеисключение, серьезность XmlSeverityType) в System.Xml.Schema.BaseValidator.SendValidationEvent (строковый код, строковый аргумент) в System.Xml.Schema.DtdValidator.ProcessElement () в System.Xml.Schema.DtdValidator.Validate () в системе.XmlValidatingReaderImpl.Read () в System.Xml.XmlReader.MoveToContent () в System.ServiceModel.Channels.Message.CreateMessage (версия MessageVersion, действие String, тело XmlDictionaryReader) в Renault.LMT.ServiceModelServerServerServiceSterServerServerServiceSterServerServerStermessageVersion, Object [] параметры, Object result)

Код, ошибка возникает в последней строке:

MemoryStream MemoryStreamm = new MemoryStream(Encoding.UTF8.GetBytes((MessageBody)));
MemoryStreamm.Position = 0;
XmlReaderSettings settingsReader = new XmlReaderSettings();
settingsReader.DtdProcessing = DtdProcessing.Parse;
settingsReader.ValidationType = ValidationType.DTD;
settingsReader.XmlResolver = null;
XmlReader reader = XmlReader.Create(MemoryStreamm, settingsReader);

MessageResponse = Message.CreateMessage(messageVersion, string.Format("ServiceModel/ILMTService/{0}", Operation), reader);

1 Ответ

1 голос
/ 14 декабря 2011

Согласно http://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.xmlresolver.aspx, не очень хорошая идея установить XmlResolver на ноль. Вполне вероятно, что DTD не может быть загружен, поэтому он не может соответствовать ни одному элементу, первый из которых html.

Я настоятельно рекомендую вам сохранить копию DTD локально и внедрить XmtResolver, который при запросе DTD возвращает эту локальную копию. Вы всегда должны делать это для DTD и схем XML, потому что многие серверы, предоставляющие эти файлы, серьезно ограничивают количество запросов из любого места.

...