XML解析检查是否存在属性(XML parse check if attribute exist)

2019-08-02 15:28发布

我做了,如果一个属性在一个XML文件存在,检查的方法。 如果它不存在,则返回“假”。 它的工作原理,但它需要一个很长的时间来解析文件。 看来它读取每个单列整个文件。 我错过了一些东西在这里? 我可以使它更有效不知何故?

    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;

}

我做了一个XML文件只有一个单列。 控制台打印出的值的15倍。 有任何想法吗?

Answer 1:

解决了! 无需额外的方法需要:

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


Answer 2:

你可以试试这个,看看是否有任何改善

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"));

如果属性出现至少一次检查

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


文章来源: XML parse check if attribute exist