2013-06-30 3 views
1

XML 파일 작업에 여전히 익숙해졌습니다. 저는 온라인에서 여러 가지 예를 살펴 보았으며 오류 처리가 부족하다는 사실에 시달렸습니다.XmlDocument를 구문 분석 할 때의 오류 처리

가장 일반적인 오류는 el.Attributes["name"].Value입니다. XML은 사람이 편집 할 수 있기 때문에 속성이 누락되었을 수 있습니다. 그리고 Value 속성을 null으로 참조하면 예외가 발생합니다. 다른 문제는 예상되는 형식이 아닌 데이터와 관련됩니다.

public static class XmlHelpers 
{ 
    public static string GetValue(this XmlAttribute attr, string defaultValue = "") 
    { 
     if (attr != null) 
      return attr.Value; 
     return defaultValue; 
    } 

    public static bool GetValueBool(this XmlAttribute attr, bool defaultValue = false) 
    { 
     bool value; 
     if (bool.TryParse(attr.GetValue(), out value)) 
      return value; 
     return defaultValue; 
    } 
} 

내가이 일을 알고 :

그래서 나는 다음의 라인을 따라 몇 가지 도우미 확장 방법을 쓰기 시작했다. 그러나 나는 무엇인가 놓치고 있냐? XmlDocument은 이러한 유형의 물건을 불필요하게하는 기능을 이미 제공합니까? 나는 다른 사람들이 이것을 어떻게 다루고 있는지 궁금 할 뿐이다.

많은 XML 파일이 인간에 의해 편집되지 않는다는 것을 알고 있습니다. 이러한 이유로 많은 사람들이 오류가 없다고 가정하는 코드를 작성할 수 있습니다. 오류가 있으면 예외가 있습니다. 나는 그것을 이해할 수있다. 하지만 파일을 사람이 편집하고 뭔가 형식이 올바르지 않으면 내 응용 프로그램에 약간의 유연성을 부여하기를 바랬습니다.

+1

LINQ에 익숙하다면 LINQ to XML로 이동하는 것이 좋습니다 (요소/속성 누락이나 이름의 철자가 같은 경우에도 마찬가지입니다). – Tim

+0

이러한 문제가 해결되지 않으면 LINQ to XML로 이동하는 것이 좋습니다. –

+0

XmlDocument를 사용하는 것이 훨씬 더 쉽습니다 (IMO). 몇 줄의 코드로 XML 문서를 구문 분석, 수정 및 생성 할 수 있습니다. – Tim

답변

1

당신이 (당신의 모양을 분석하고있는 XML을 무엇을) 수용에 관심이 어떤 오류에 따라 XmlSerializer 클래스는 사용 될 수 있습니다 구문 분석 오류 처리

void Main() 
{ 
    var xmlSerializer = new XmlSerializer(typeof(Foo)); 
    var foo1 = (Foo)xmlSerializer.Deserialize(new StringReader(@"<Foo a=""11""></Foo>")); 
    Console.WriteLine(foo1.A); // 11 

    var foo2 = (Foo)xmlSerializer.Deserialize(new StringReader(@"<Foo></Foo>")); 
    Console.WriteLine(foo2.A); // 10 (fell back to the default) 

    // throws format exception 
    var foo3 = (Foo)xmlSerializer.Deserialize(new StringReader(@"<Foo a=""x""></Foo>")); 
} 

// Define other methods and classes here 
[XmlRoot("Foo")] 
public class Foo { 
    public Foo() { this.A = 10; } 

    [XmlAttribute("a")] 
    public int A { get; set; } 
} 

분명히 더 어렵다 . 한 가지 방법은 위에서 설명한대로 XmlSerializer를 사용할 수 있지만 모든 형식에 대해 문자열을 사용하는 것입니다 (잘못된 서식을 처리하는 래퍼 속성이있는 경우). 보다 안전한 유형을 얻기 위해 IXmlSerializable을 "안전하게"구현하고 사용자가 System 유형에 대한 암시 적 변환을 정의하는 유형을 정의 할 수 있습니다.

0

"오류"에 대해 실제로 말하는 것이 아닙니다. 합법적으로 발생할 수있는 일에 대해 이야기하고있는 것입니다. XML은 매우 유연한 형식입니다. 문제 중 하나는 기존 프로그래밍 언어의 유연성이 훨씬 떨어진다는 점입니다.

찾고있는 유연성의 종류는 XPath, XQuery 및 XSLT와 같은 XML 지향 언어에 내장되어 있습니다. DOM 인터페이스에 대한 저수준 프로그래밍은 XPath에 비해 정말 힘든 작업입니다.

관련 문제