.LoadXml()을 호출하기 전에 문자열 입력에서 유효한 xml을 확인하는 방법
-
01-07-2019 - |
문제
나는 예외를 잡지 않고 이 작업을 수행하는 것을 훨씬 선호합니다. LoadXml()
그리고 이 결과를 내 논리의 일부로 사용합니다.직접 XML을 수동으로 구문 분석하지 않는 솔루션에 대한 아이디어가 있습니까?VB에서는 XmlException을 발생시키는 대신 이 함수에 대해 false 반환 값을 갖고 있는 것 같습니다.사용자로부터 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;
}
}
다른 팁
자체 ValidationEventHandler를 제공하는 경우 XmlValidatingReader를 사용하면 예외가 방지됩니다.
XmlValidatingReader 및 ValidationEventHandler를 작동시킬 수 없습니다.잘못된 형식의 xml에 대해서는 XmlException이 계속 발생합니다.반사경을 사용하여 방법을 확인하여 이를 확인했습니다.
실제로 초당 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, "수동으로" 구문 분석하고 예외 사항을 차단할 수 있습니다.그러나 초당 100개의 XML 조각을 구문 분석하지 않는 한 예외를 포착하지 않는 이유는 무엇입니까?