2008-09-17 6 views
36

LoadXml()에서 예외를 catch하고이 결과를 내 논리의 일부로 사용하지 않는 것이 좋습니다. 수동으로 xml을 구문 분석하지 않는 솔루션에 대한 아이디어가 있습니까? VB는 XmlException을 던지기보다는이 함수에 대해 반환 값이 false라고 생각합니다. Xml 입력은 사용자가 제공합니다. 감사합니다!.LoadXml()을 호출하기 전에 문자열 입력에서 유효한 XML을 확인하는 방법

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

답변

55

그냥 예외를 잡으십시오. XML 구문 분석과 비교할 때 예외 잡기에서 발생하는 작은 오버 헤드가 발생합니다. 당신이 (안 성능 문체 이유로) 기능을 원하는 경우

, 스스로를 구현 :

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

이것은 매우 높은로드 환경에서 페이지로드시 발생하며 예외의 오버 헤드는 적지 만 피할 수있을만큼 충분히 중요합니다. –

+4

이것을 증명하기 위해 측정을 했습니까? 또한 try-catch는 예외가 실제로 발생하는 경우에만 성능 페널티를 부과한다는 점을 기억하십시오. –

+3

XML의 출처는 어디입니까? 대부분의 경우 유효한 XML을 기대하는 경우 모든 호출에서 유효성 검사를 수행하는 오버 헤드가 없습니다. 그냥 예외를 처리하고 이동하십시오. –

10

사용자가 ValidationEventHandler를 제공하면 XmlValidatingReader를 사용하면 예외가 발생하지 않습니다.

1

이미 말한대로, 나는 오히려 예외를 잡을 싶지만, XmlParserContext를 사용하여, 당신은 시도 할 수 "수동으로"구문 분석하고 모든 예외를 차단합니다. 그러나 초당 100 개의 XML 조각을 파싱하지 않으면 왜 예외를 포착하지 않습니까?

3

잡기가 너무 많은 경우 XML 스키마를 사용하여 XML 유효성을 미리 확인하여 XML이 올바른지 확인해야 할 수 있습니다.하지만 잡기보다 더 나빠질 수 있습니다.

6

XmlValidatingReader & ValidationEventHandler를 작동시킬 수 없습니다. XML이 잘못 작성된 경우에도 XmlException이 발생합니다. 나는 반사경을 가진 방법을 보아 이것을 검증했다.

사실 초당 100,000 개의 짧은 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도 작동하지 않았습니다.

누구나 정규식을 성공시킬 수 있습니까?

+6

> 누구나 regx를 성공시킬 수 있습니까? 유명한 인용문을 생각 나게합니다. "문제가 발생하면"정규식을 사용할 것입니다. "라고 생각하는 사람들이 있습니다. 이제는 두 가지 문제가 있습니다." –

+0

정규 표현식에 대해 농담하는 거죠? 그 일에 대한 잘못된 도구. 기본적으로 다음과 같은 문제입니다. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – Anthony

+0

이 잘못된 텍스트가 유효한 것으로 처리됩니다. sdf >>>> Amit