1

第一次使用 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 能够做到这一点的期望是幼稚的,但是,我已经为琐碎的漂亮 XML 处理编写了一大堆 XPath 表达式和 if-else 语句,对此我已经积累了一些苦涩。所以我确实怀着很大的希望转向 LINQ。

4

1 回答 1

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");
于 2013-03-28T16:37:56.350 回答