2013-03-28 43 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