Как проверить действительный 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;
     }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
44
0
91 261
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Ответ принят как подходящий

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

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

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

Это происходит при загрузке страницы в среде с очень высокой нагрузкой, накладные расходы из-за исключения небольшие, но достаточно значительны, чтобы их следует избегать.

Chris Ballance 17.09.2008 22:53

Вы сделали замеры, чтобы доказать это? Также помните, что try-catch налагает (относительно небольшое) снижение производительности только в том случае, если исключение действительно сгенерировано.

Rasmus Faber 17.09.2008 23:00

Откуда берется XML? Если большую часть времени вы ожидаете наличия действительного XML, не стоит тратить время на проверку при каждом вызове. Просто обработайте исключение и двигайтесь дальше.

Tim Booker 17.09.2008 23:12

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

Simon Steele 18.09.2008 00:55

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

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

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

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

> Кому-нибудь удается с регулярным выражением? Напоминает мне известную цитату: «Некоторые люди, столкнувшись с проблемой, думают:« Я знаю, я буду использовать регулярные выражения ». Теперь у них две проблемы».

Chris Bennet 31.05.2012 16:00

Вы шутите о регулярном выражении, верно? Инструмент не подходит для работы. По сути, это та же проблема, что и эта: stackoverflow.com/questions/1732348/…

Anthony 06.05.2013 05:59

этот недопустимый текст считается действительным: <root><elem>sdf</elem>>>>> </root>

Amit 06.02.2014 01:24

@Amit String <root><elem>sdf</elem>>>>></root> (с добавленным XML-объявлением <?xml version = "1.0"?>) является допустимым XML. Действительность может быть подтверждена с помощью Валидатор W3C.

Lightman 25.03.2017 10:58

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