2013-03-24 83 views
0

我知道關於這個主題有很多問題,但是我沒有嘗試過的例子都適用於我。C#通過LINQ解析XML來創建自定義對象

我有被構造像這樣現有的XML文檔:

<root> 
    <ElementA> 
     <element1>sometext</element1> 
     <element2>sometext</element2> 
     <element3>sometext</element3> 
    </ElementA> 

    <ElementA> 
     <element1>sometext</element1> 
     <element2>sometext</element2> 
     <element3>sometext</element3> 
    </ElementA> 

    <ElementB> 
     <element1>sometext</element1> 
     <element2>sometext</element2> 
     <element3>sometext</element3> 
     <element4>sometext</element4> 
     <element5>sometext</element5> 
    </ElementB> 

    <ElementB> 
     <element1>sometext</element1> 
     <element2>sometext</element2> 
     <element3>sometext</element3> 
     <element4>sometext</element4> 
     <element5>sometext</element5> 
    </ElementB> 

    <ElementC> 
     <element1>sometext</element1> 
     <element2>sometext</element3> 
    </ElementC> 

    <ElementC> 
     <element1>sometext</element1> 
     <element2>sometext</element2> 
    </ElementC> 
</root> 

我需要找到所有的ElementA,B和Cs和創建類型的新對象objA等其屬性對應各個元素的子元素。以下是我嘗試過的示例代碼。

var doc = XElement.Load(filename); 
var data = from ele in doc.Elements() 
      where ele.Name.LocalName.Equals("ElementA") 
      select new objA 
      { 
       name = ele.Element("element1").Value 
       address = ele.Element("element2").Value 
      }; 

但是,當我嘗試迭代「數據」集合時,會拋出一個空的異常錯誤。我不瞭解什麼?

回答

1

可以使用Elements("tagName")得到它的名字元素:

var data = from ele in doc.Elements("ElementA") 
      select new objA 
      { 
       name = (string)ele.Element("element1"), 
       address = (string)ele.Element("element2") 
      }; 

您還應該使用(string)XElementInstance而不是XElementInstance.Value,避免NullReferenceException當元素不存在XML。

上面粘貼的代碼爲您的示例輸入數據返回2個元素。

+0

不適用於我。 「數據」結束爲空。我曾嘗試過您的解決方案,但它似乎像doc.Elements(「ElementA」)沒有找到ElementA。這就是爲什麼我必須使用「where ele.Name.LocalName.Equals()」 – 2013-03-24 14:39:21

+0

因此,您的真實數據必須是不正確的。我已經用你的示例測試了它,並且工作正常。 – MarcinJuraszek 2013-03-24 14:40:51

+0

的確,我想知道這個XML文檔是不是有些奇怪。我給出的例子不是原始數據,而是代表邏輯佈局。不幸的是,我不得不使用這個特殊的XML文件。如果以前使用foreach循環和switch/case,但是它非常難看,我已經成功解析了。 – 2013-03-24 14:48:41