2013-06-30 70 views
1

我仍然習慣使用XML文件。我一直在看一些在線的例子,並且由於缺少錯誤處理而受到了打擊。解析XmlDocument時處理錯誤

最常見的錯誤類似el.Attributes["name"].Value。由於XML是可編輯的,所以可能缺少該屬性。並嘗試引用null上的Value屬性將引發異常。其他問題將與數據不符合預期格式有關。

於是我開始寫一些輔助擴展方法大致如下的行:

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

這很容易(IMO),然後使用XmlDocument是主要原因。您可以使用幾行代碼解析,修改和創建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,並定義向系統類型的隱式轉換。

0

你不是在談論這裏的「錯誤」,而是在談論可以合法發生的事情。 XML是一種非常靈活的格式。其中一個問題是傳統編程語言的靈活性要低得多。

您正在尋找的靈活類型內置於面向XML的語言,如XPath,XQuery和XSLT。與XPath相比,針對DOM接口的低級編程確實很難,因爲您發現的原因。