【问题标题】:how to get xml attribute values by its name in c# [closed]如何在c#中通过其名称获取xml属性值[关闭]
【发布时间】:2014-04-13 16:48:08
【问题描述】:
<Entity>
    <Fields>
        - <Field Name="expected">
          <Value>011919884841926</Value> 
          </Field>
        - <Field Name="name">
          <Value>Dial</Value>
     </Fields>
    <Fields>.....</Fields>
    <Fields>.....</Fields>
    <Fields>.....</Fields>
    <Fields>......</Fields>
    <Fields>....</Fields>
</Entity>

如何在 c# 中获取 Dial = 011919884841926 作为键值对。

List<Dictionary<string, string>> tempDefect = new List<Dictionary<string, string>>();
                if (!string.IsNullOrEmpty(responseXML))
                {
                    XmlDocument configXml = new XmlDocument();
                    configXml.LoadXml(responseXML);
                    XPathNavigator navigator = configXml.CreateNavigator();
                    XPathNodeIterator nodeIterator = (XPathNodeIterator)navigator.Evaluate(rootEntities + "/" + rootEntity + "/" + rootElement);
                    for (int i = 0; i < nodeIterator.Count; i++)
                    {
                        nodeIterator.MoveNext();
                        Dictionary<string, string> tempDefectRows = new Dictionary<string, string>();
                        configXml = new XmlDocument();
                        configXml.LoadXml(nodeIterator.Current.OuterXml.ToString());
                        navigator = configXml.CreateNavigator();
                        XPathNodeIterator nodeIterator1 = (XPathNodeIterator)navigator.Evaluate(rootElement + "/" + loginParamsElement);

                        if (nodeIterator.Count != 0)
                        {
                            for (int j = 0; j < nodeIterator1.Count; j++)
                            {
                                nodeIterator1.MoveNext();
                                XmlNode node = ((IHasXmlNode)nodeIterator1.Current).GetNode();
                                if (attributes.Contains((T)Enum.Parse(typeof(T), node.Attributes["Name"].Value.ToString().Replace("-", "_"), true)))
                                {
                                    if (node.HasChildNodes)
                                    {
                                        configXml.LoadXml(node.InnerXml.ToString());
                                        XPathNavigator navigator2 = configXml.CreateNavigator();
                                        XPathNodeIterator nodeIterator2 = (XPathNodeIterator)navigator2.Evaluate("Value");

                                        if (nodeIterator2.Current.ToString().Trim() != StripTagsCharArray(nodeIterator2.Current.ToString().Replace("&nbsp;", "").Trim()).Trim())
                                            {
                                                tempDefectRows.Add(node.Attributes["Name"].Value.ToString(), StripTagsCharArray(nodeIterator2.Current.ToString().Replace("&nbsp;", "").Trim()).Trim());
                                            }
                                            else
                                            {
                                                tempDefectRows.Add(node.Attributes["Name"].Value.ToString(), nodeIterator2.Current.ToString().Trim());
                                            }
                                    }
                                    else
                                    {
                                        tempDefectRows.Add(node.Attributes["Name"].Value.ToString(), string.Empty);
                                    }
                                }
                            }
                            if (tempDefectRows.ContainsValue(filterBy))
                            {
                                testID = tempDefectRows["id"].ToString();
                                tempDefect.Add(tempDefectRows);
                                if (typeof(T).Name.ToString() == "Test")
                                    break;
                            }

                        }
                    }
                }

这是我的研究和工作。但是我在 2 到 3 个循环后得到了想要的输出……这就是我在这里发布的原因…… 有什么简单的方法可以解决。

【问题讨论】:

    标签: c# xml xml-parsing linq-to-xml xmlreader


    【解决方案1】:

    使用 Linq To Xml

    var xDoc = XDocument.Load(filename);
    var dict = xDoc.Descendants("Fields")
                .ToDictionary(f => GetValue(f, "name"), f => GetValue(f, "expected"));
    
    
    string GetValue(XElement root, string attr)
    {
        return root.Elements("Field")
                    .First(a => a.Attribute("Name").Value == attr)
                    .Element("Value").Value;
    }
    

    【讨论】:

    • 不包含 .toDictionary() 和 .first() 即使它是 iEnumerable。
    • 别忘了,using System.Linq;using System.Xml.Linq;
    • 我之前试过,同样的错误,所以我跳过了。即使 xElement.elements 是 iEnumerable,为什么 .first 也不会出现。
    • 是的,我的错误...我使用过 system.xml.linq 所以我认为没有必要使用 system.Linq...
    【解决方案2】:

    Linq to xml 是解析 xml 字符串的好方法Code project 有很好的文章LINQ to XML。这可能对你有帮助

    【讨论】:

    • 感谢您的关注。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    相关资源
    最近更新 更多