.LoadXml()을 호출하기 전에 문자열 입력에서 유효한 xml을 확인하는 방법

StackOverflow https://stackoverflow.com/questions/86292

문제

나는 예외를 잡지 않고 이 작업을 수행하는 것을 훨씬 선호합니다. 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 조각을 구문 분석하지 않는 한 예외를 포착하지 않는 이유는 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top