2013-03-28 76 views
1

第一次用的LINQ to XML,攀登學習曲線...的LINQ to XML:解析簡單的XML入門

我正在尋找最平滑的方式如何檢索和從XML文件中的數據轉換,用盡可能少如果其他人和上帝保佑儘可能地嘗試抓住陳述。我真的很討厭所有那些冗長的代碼,只是爲了從文檔中檢索單個值。

話雖如此,我正在尋找一種故障安全解決方案,如果XML文檔的結構意外發生變化,那麼這種解決方案不會中斷。在這種情況下,我期望檢索到空值,以便稍後在代碼中檢查它。

這裏是我的XML文檔:

<?xml version="1.0" encoding="utf-8"?> 
<Entry> 
    <IntField>11</IntField> 
    <StringField>String data</StringField> 
    <DateTimeField>28/03/2013 18:10:02</DateTimeField> 
</Entry> 

我找的代碼,我每個代碼行中檢索一個值,即:

myXMLdoc = XDocument.Load("sourceFile.xml"); 
int? myIntField = (smart linq query that retrieves&converts the value, with fallback of null); 
string? myStringField = (smart linq query etc.); 
DateTime? myDateTimeField = (smart linq query etc.); 
if (myIntField == null) 
{ 
    // Complain that structure of the XML doc is bad 
} 

也許我的期望,LINQ可以做到這一點是天真,但是,編寫了XPath表達式和if-else語句來處理瑣碎漂亮的XML處理的塊和塊,我對此產生了一些怨恨。所以我轉而對LINQ懷有很大的希望。

回答

2

儘管LINQ2XML本身缺乏必要的「魔力」,但它爲您自己構建代碼提供了足夠的「基礎」。這裏是告訴您如何閱讀從任意深度的元素的int?爲例(假設路徑是唯一的,當然):

public static class LinqExt { 
    public static int? ReadInt(this XElement e, string path, int? fallback = null) { 
     foreach (var name in path.Split('/')) { 
      e = e.Element(name); 
      if (e == null) { 
       return fallback; 
      } 
     } 
     int val; 
     return int.TryParse(e.Value, out val) ? val : fallback; 
    } 
} 

可以按如下方式使用這個擴展方法:

var myXMLdoc = XDocument.Load("sourceFile.xml"); 
var intVal = myXMLdoc.Root.ReadInt("IntField"); 

的方法甚至會用一些嵌套,如果你的文件看起來像這樣

<?xml version="1.0" encoding="utf-8"?> 
<Entry> 
    <Nested1> 
     <Nested2> 
      <IntField>11</IntField> 
     </Nested2> 
    </Nested1> 
</Entry> 

工作,例如你會得到這樣的價值:

var intVal = myXMLdoc.Root.ReadInt("Nested1/Nested2/IntField"); 
+0

通過擴展方法,非常聰明,謝謝。 – Passiday