1

LINQ to XML を初めて使用し、学習曲線を上っていきます...

XML ファイルからデータを取得して変換する最もスムーズな方法を探しています。ドキュメントから単一の値を取得するだけの長いコードは本当に嫌いです。

そうは言っても、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>

コードの行ごとに 1 つの値を取得するコードを探しています。

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 式の塊と塊と、簡単できれいな XML 処理のための 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 に答える