Как проверить допустимость xml при вводе строки перед вызовом .loadXML()

StackOverflow https://stackoverflow.com/questions/86292

Вопрос

Я бы предпочел сделать это без обнаружения исключения в LoadXml() и использую эти результаты как часть моей логики.Есть идеи по решению, которое не требует ручного разбора xml самостоятельно?Я думаю, что VB имеет возвращаемое значение false для этой функции вместо того, чтобы выдавать XmlException.Xml-ввод предоставляется пользователем.Большое спасибо!

if (!loaded)
{
     this.m_xTableStructure = new XmlDocument();
     try
     {
          this.m_xTableStructure.LoadXml(input);
          loaded = true;
     }
     catch
     {
          loaded = false;
     }
}
Это было полезно?

Решение

Просто поймайте исключение.Небольшие накладные расходы на перехват исключения незначительны по сравнению с синтаксическим анализом XML.

Если вам нужна функция (по стилистическим соображениям, а не для повышения производительности), реализуйте ее самостоятельно:

public class MyXmlDocument: XmlDocument
{
  bool TryParseXml(string xml){
    try{
      ParseXml(xml);
      return true;
    }catch(XmlException e){
      return false;
    }
 }

Другие советы

Использование XmlValidatingReader предотвратит исключения, если вы предоставите свой собственный ValidationEventHandler.

Мне не удалось заставить XmlValidatingReader и ValidationEventHandler работать.Исключение XmlException по-прежнему выдается для неправильно сформированного xml.Я убедился в этом, просмотрев методы с помощью reflector.

Мне действительно нужно проверять 100 коротких фрагментов XHTML в секунду.

public static bool IsValidXhtml(this string text)
{
   bool errored = false;
   var reader = new XmlValidatingReader(text, XmlNodeType.Element, new XmlParserContext(null, new XmlNamespaceManager(new NameTable()), null, XmlSpace.None));
   reader.ValidationEventHandler += ((sender, e) => { errored = e.Severity == System.Xml.Schema.XmlSeverityType.Error; });

   while (reader.Read()) { ; }
   reader.Close();
   return !errored;
}

XmlParserContext тоже не сработал.

Кто-нибудь преуспел с регулярным выражением?

Если перехват для вас слишком сложен, то вы можете захотеть предварительно проверить XML, используя XML-схему, чтобы убедиться, что XML в порядке, но это, вероятно, будет хуже, чем перехват.

КАК уже было сказано, я бы предпочел перехватить исключение, но используя XmlParserContext XmlParserContext, вы могли бы попытаться проанализировать "вручную" и перехватить любую аномалию;однако, если вы не обрабатываете 100 фрагментов xml в секунду, почему бы не перехватить исключение?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top