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

本文关键字:XML 简单 条目 to LINQ | 更新日期: 2023-09-27 18:06:33

第一次使用LINQ to XML,学习曲线不断攀升…

我正在寻找如何从XML文件检索和转换数据的最流畅的方法,尽可能少使用if-else和try-catch语句。我真的很讨厌那些为了从文档中检索单个值而编写的冗长代码。

说到这里,我正在寻找一个故障安全的解决方案,如果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可以做到这一点的期望是naïve,但是,好吧,为琐碎的漂亮XML处理编写了大量XPath表达式和if-else语句之后,我对它产生了一些痛苦。因此,我对LINQ抱有很大的希望。

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

尽管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");