首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XML分析检查属性是否存在

XML分析检查属性是否存在
EN

Stack Overflow用户
提问于 2012-11-12 18:34:17
回答 3查看 39.9K关注 0票数 18

我编写了一个方法,用于检查XML文件中是否存在属性。如果它不存在,则返回"False“。它可以工作,但它需要很长的时间来解析文件。它似乎读取了每一行的整个文件。我是不是漏掉了什么?我能以某种方式让它更有效吗?

代码语言:javascript
运行
复制
    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";
        }
    }

我测试将该方法替换为只返回和接收字符串的方法:

代码语言:javascript
运行
复制
public static string checkXMLcount(string x)
{
    Console.WriteLine(x);
    Console.ReadLine();
    return x;

}

我创建了一个只有一行的XML文件。控制台将该值打印15次。有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-13 20:22:18

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

代码语言:javascript
运行
复制
countObject = spec.Attribute("mep_count") != null ? spec.Attribute("mep_count").Value : "False",
票数 43
EN

Stack Overflow用户

发布于 2012-11-12 19:18:44

你可以试试这个,看看有没有什么改进

代码语言:javascript
运行
复制
class xmlAttributes
{
    public string Node;
    public Dictionary<string, string> Attributes;
} 

现在,有了这个LINQ,所有属性都存储在一个字典中(每个节点),并且可以通过属性名称进行访问。

代码语言:javascript
运行
复制
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节点上都存在

代码语言:javascript
运行
复制
var AttributeFound = Result.All(x => x.Attributes.ContainsKey("AttrName"));

检查属性是否至少出现一次

代码语言:javascript
运行
复制
var AttributeFound = Result.Any(x => x.Attributes.ContainsKey("AttrName"));
票数 2
EN

Stack Overflow用户

发布于 2020-06-24 11:12:32

我只想指出:

代码语言:javascript
运行
复制
countObject = spec.Attribute("mep_count")?.Value;

它在整个链条上都起作用:

代码语言:javascript
运行
复制
countObject = spec?.Attribute("mep_count")?.Value

这将产生相同的效果,其中countObject将被设置为null或该值(如果存在)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13342143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档