Как проверить действительный 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;
}
}
Ответы
Ответ 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 фрагментов в секунду, почему бы не поймать исключение?