Подтвердить что ты не робот

Как проверить действительный xml в строковом вводе перед вызовом .LoadXml()

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

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

Ответ 1

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

Если вы хотите использовать эту функцию (по стилистическим причинам, а не по производительности), выполните ее сами:

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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