web-dev-qa-db-ja.com

属性が存在するかどうかXML解析チェック

XMLファイルに属性が存在するかどうかを確認するメソッドを作成しました。存在しない場合は「False」を返します。動作しますが、ファイルの解析に非常に長い時間がかかります。単一の行ごとにファイル全体を読み取るようです。ここで何か見逃しましたか?どういうわけかもっと効果的にすることはできますか?

    public static IEnumerable<RowData> getXML(string XMLpath)
    {
        XDocument xmlDoc = XDocument.Load("spec.xml");

        var specs = from spec in xmlDoc.Descendants("spec")
                    select new RowData
                    {
                        number= (string)spec.Attribute("nbr"),
                        name= (string)spec.Attribute("name").Value,
                        code = (string)spec.Attribute("code").Value,
                        descr = (string)spec.Attribute("descr").Value,
                        countObject = checkXMLcount(spec),


        return specs;
    }

    public static string checkXMLcount(XElement x)
    {
        Console.WriteLine(x.Attribute("nbr").Value);
        Console.ReadLine();
        try
        {
            if (x.Attribute("mep_count").Value == null)
            {
                return "False";
            }
            else
            {
                return x.Attribute("mep_count").Value;
            }
        }
        catch
        {
            return "False";
        }
    }

メソッドを、文字列のみを返し、受け取るものに置き換えることをテストしました。

public static string checkXMLcount(string x)
{
    Console.WriteLine(x);
    Console.ReadLine();
    return x;

}

1行のみのXMLファイルを作成しました。コンソールは値を15回出力します。何か案は?

15
Joe

解決しました!追加の方法は必要ありません:

countObject = spec.Attribute("mep_count") != null ? spec.Attribute("mep_count").Value : "False",
40
Joe

これを試して、改善があるかどうかを確認できます

class xmlAttributes
{
    public string Node;
    public Dictionary<string, string> Attributes;
} 

このLINQを使用すると、すべての属性がディクショナリ(ノードごと)に保存され、属性名を介してアクセスできます。

var Result = XElement.Load("somedata.xml").Descendants("spec")
                      .Select(x => new xmlAttributes
                      {
                          Node = x.Name.LocalName,
                          Attributes = x.Attributes()
                                     .ToDictionary(i => i.Name.LocalName,
                                                        j => j.Value)
                      });

すべてのXMLノードに属性が存在するかどうかを確認します

var AttributeFound = Result.All(x => x.Attributes.ContainsKey("AttrName"));

属性が少なくとも1回出現するかどうかを確認します

var AttributeFound = Result.Any(x => x.Attributes.ContainsKey("AttrName"));
2
Prabhu Murthy