3

一部の XML を解析する最善の方法を決定するのは難しいと思います。それらは非常に多くの可能な方法のようですが、実際に私と一緒にクリックしたものはありません.

私の現在の試みは次のようになります。

XElement xelement = XElement.Parse(xmlText);
var name = xelement.Element("Employee").Attribute("name").Value;

だから、これはうまくいきます。ただし、「Employee」要素または「name」属性が欠落している場合は、例外がスローされます。例外をスローしたくありません。

オンラインで入手可能ないくつかの例を調べると、次のようなコードが表示されます。

XElement xelement = XElement.Load("..\\..\\Employees.xml");
IEnumerable<XElement> employees = xelement.Elements();
Console.WriteLine("List of all Employee Names :");
foreach (var employee in employees)
{
    Console.WriteLine(employee.Element("Name").Value);
}

これは、まったく同じ問題に悩まされているようです。「Name」要素が存在しない場合はElement()戻りnull、プロパティの呼び出しでエラーが発生しValueます。

上記の最初のコード スニペットのような多数のブロックが必要です。一部のデータが欠落している場合に例外をスローせずに動作させる簡単な方法はありますか?

4

5 に答える 5

3

このような場合、拡張メソッドは参照が null の場合でも機能するため、よく使用します。2012 年初頭の Anders Abel の非常に優れたブログ投稿「拡張メソッドによるNull 処理」からの拡張メソッドのわずかに変更されたバージョンを使用します。

public static class XElementExtension
{
    public static string GetValueOrDefault(this XAttribute attribute,
                                           string defaultValue = null)
    {
        return attribute == null ? defaultValue : attribute.Value;
    }

    public static string GetAttributeValueOrDefault(this XElement element,
                                                    string attributeName, 
                                                    string defaultValue = null)
    {
        return element == null ? defaultValue : element.Attribut(attributeName)
                                                .GetValueOrDefault(defaultValue);
    }
}

要素または属性が存在しない場合に「null」を返したい場合:

var name = xelement.Element("Employee")
                   .GetAttributeValueOrDefault("name" );

要素または属性が存在しない場合にデフォルト値を返したい場合:

var name = xelement.Element("Employee")
                    .GetAttributeValueOrDefault("name","this is the default value");

for ループで使用するには:

XElement xelement = XElement.Load("..\\..\\Employees.xml");
IEnumerable<XElement> employees = xelement.Elements();
Console.WriteLine("List of all Employee Names :");
foreach (var employee in employees)
{
    Console.WriteLine(employee.GetAttributeValueOrDefault("Name"));
}
于 2013-01-26T08:06:58.343 に答える
2

いつでもXPathを使用できます。

string name = xelement.XPathEvaluate("string(Employee/@name)") as string;

これは、属性の値、またはnullいずれかEmployeeまたは@name存在しない場合のいずれかになります。

そして、反復例の場合:

foreach (XNode item in (IEnumerable)xelement.XPathEvaluate("Employee/Name"))
{
     Console.WriteLine(item.Value);
}

XPathEvaluate()ここでは有効なノードのみが選択されるため、item常にnull以外になることが保証されます。

于 2013-01-26T16:23:49.757 に答える
0

それはすべて、XML からデータを抽出した後にデータをどうしたいかによって異なります。

XML 処理用に設計された言語 (XSLT や XQuery など) を検討する方が、そうでない C# のような言語を使用するのに適しています (ただし、Linq はハイブリッドのようなものを提供します)。C# や Java を使用すると、XML が非常に柔軟であるという事実に対処するために、常に多くの作業を行う必要があります。

于 2013-01-26T09:42:27.077 に答える
0

ネイティブ XmlReaderを使用します。XElementがオブジェクト表現を構築するのではなく、大きなXMLファイルを読み取ることが問題である場合は、 XMLのみをストリーミングするJava SAXパーサーのようなものを構築できます。

例: http://www.codeguru.com/csharp/csharp/cs_data/xml/article.php/c4221/Writing-XML-SAX-Parsers-in-C.htm

于 2013-01-26T16:16:38.030 に答える