LINQ to XML:解析简单的XML条目

时间:2013-03-28 16:09:39

标签: c# xml linq

第一次使用LINQ to XML,攀登学习曲线......

我正在寻找如何从XML文件中检索和转换数据的最流畅的方法,尽可能少的if-else和上帝禁止的try-catch语句。我真的很讨厌所有冗长的代码,只是为了从doc中检索单个值。

话虽如此,我正在寻找一种自动防故障解决方案,如果XML文档的结构出乎意料地发生了变化,那么这种解决方案就不会中断。在这种情况下,我希望检索到null值,以便稍后在代码中检查它。

这是我的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可以做到这一点的期望是天真的,但是,好吧,我已经写了一些XPAT表达式和if-else语句的块和简单的非常好的XML处理,我已经对它产生了一些苦涩。所以我真的转向LINQ。

1 个答案:

答案 0 :(得分: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");