1

これは、基本的な Linq から XML へのクエリで立ち往生しているこの質問の派生物です

LINQ の記述と LINQ to XML についての学習が上達するように努めています。LINQ クエリは期待どおりの結果を返しますが、コードはきれいに見えません。もっと良い書き方はないでしょうか?

XML

    <ApiResponse xmlns="http://api.namecheap.com/xml.response" Status="OK">
        <Errors/>
        <Warnings/>
        <RequestedCommand>namecheap.domains.check</RequestedCommand>
        <CommandResponse>
            <DomainCheckResult Domain="gooaagle.com" Available="true"/>
        </CommandResponse>
        <Server>WEB1-SANDBOX1</Server>
        <GMTTimeDifference>--4:00</GMTTimeDifference>
        <ExecutionTime>0.859</ExecutionTime>
    </ApiResponse>

C#

XNamespace ns = "http://api.namecheap.com/xml.response";
var response = (
    from r in doc.Elements()
    select new
    {
        Errors = r.Element(ns + "Errors").Value,
        Warnings = r.Element(ns + "Warnings").Value,
        RequestedCommand = r.Element(ns + "RequestedCommand").Value,
        CommandResponse = new
                      {
                         Domain= r.Element(ns + "CommandResponse").Element(ns + "DomainCheckResult").Attribute("Domain"),
                         Available = r.Element(ns + "CommandResponse").Element(ns + "DomainCheckResult").Attribute("Available")
                      },
       Server = r.Element(ns + "Server").Value
    });
4

1 に答える 1

2

理由もなくクエリ式を使用していて、不要な角かっこや非常に長い行がありますが、それ以外は問題ないように見えます。わかりやすくするための1つのオプションは、匿名型の使用を避けることです。メソッドを使用してクラス(たとえばApiResponse)を作成し、次のFromXElementように記述できるようにします。

var response = doc.Elements().Select(x => ApiResponse.FromXElement(x));

またはC#4の場合:

var response = doc.Elements().Select(ApiResponse.FromXElement);

次に、クエリからプロジェクションを取り出し、通常のメソッドで記述できます。あなたはそれをいくつかのステートメントに分割することもできません-それはあなたの呼び出しです。

ちなみに、実際に複数の要素を期待しているかどうかはまだ明らかではありません。ドキュメントにはトップレベルの要素を1つしか含めることができません。実際にルート要素のみが役立つことを期待している場合は、クエリを削除してください。完全に分けます。

また、文字列リテラルを回避する方が明確な場合もあります(そしてns + ...、次のようにコード内で繰り返されます:

private static readonly XNamespace ResponseNs = 
    "http://api.namecheap.com/xml.response";
private static readonly XName ErrorsName = ResponseNs + "Errors";
private static readonly XName WarningsName = ResponseNs + "Warnings";
// etc

次に、次を使用できます。

Errors = r.Element(ErrorsName).Value
于 2012-05-31T18:51:18.957 に答える