Как проверить действительный XML в строке ввода перед вызовом .LoadXml () - PullRequest
38 голосов
/ 17 сентября 2008

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

if (!loaded)
{
     this.m_xTableStructure = new XmlDocument();
     try
     {
          this.m_xTableStructure.LoadXml(input);
          loaded = true;
     }
     catch
     {
          loaded = false;
     }
}

Ответы [ 5 ]

58 голосов
/ 17 сентября 2008

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

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

public class MyXmlDocument: XmlDocument
{
  bool TryParseXml(string xml){
    try{
      ParseXml(xml);
      return true;
    }catch(XmlException e){
      return false;
    }
 }
10 голосов
/ 17 сентября 2008

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

6 голосов
/ 12 ноября 2009

Мне не удалось заставить работать XmlValidatingReader & ValidationEventHandler. XmlException все еще выбрасывается для неправильно сформированного XML. Я проверил это, просмотрев методы с отражателем.

Мне действительно нужно проверять сотни коротких фрагментов 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 также не работал.

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

3 голосов
/ 17 сентября 2008

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

1 голос
/ 17 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...