如何从XML读取字典元素?

时间:2014-09-15 13:06:56

标签: c# xml

我试图根据值获取相关的XML属性,但我无法使其工作。

我想要实现的是基于我想要输出元素名称的返回值。

我哪里错了?

到目前为止,这是我的代码:

XML:

<addresses>
    <address name="house 1">No 1</ipaddress>
    <address name="house 2">Flat 3</ipaddress>
    <address name="house 3">Siccamore Drive</ipaddress>
</addresses>

C#:

string configPath = _AppPath + @"\HouseAddresses.xml";
XDocument addressXdoc = XDocument.Load(configPath);
XElement addressXmlList = addressXdoc.Element("traplistener");
foreach (XNode node in addressXmlLst.Element("addresses").Descendants())
{
    PropertyList = ("string")node.Attribute("name");  
}

2 个答案:

答案 0 :(得分:1)

XNode类型可视为“基础”。正如文档所述,represents the abstract concept of a node (element, comment, document type, processing instruction, or text node) in the XML tree。例如,将Attribute属性添加到text在XML上下文中没有意义。因此,XNode类型不提供Attribute属性。但是,XElement类型确实如此。因此,将foreach循环更改为以下版本应该可以解决问题:

foreach (XElement element in addressXmlLst.Element("addresses").Descendants())
{
    PropertyList = ("string")element.Attribute("name");  
}

关于代码的“随机”注释:自XElement扩展XNode后,Descendants()返回的元素被正确转换;出于这个原因,您的问题似乎来自XNode未公开Attribute属性的事实,实际上,它来自不必要的类型转换。

作为改进,我建议如下:

foreach (XElement element in addressXmlLst.Element("addresses").Descendants())
{
    //check if the attribute is really there
    //in order to prevent a "NullPointerException"
    if (element.Attribute("name") != null)
    {
        PropertyList = element.Attribute("name").Value;
    }
}

答案 1 :(得分:0)

除了Andrei的回答,您还可以直接通过LINQ将xml转换为字典:

var dictionary = addressXmlLst.Element("addresses").Descendants()
      .ToDictionary(
        element => element.Attribute("name").Value, // the key
        element => element.Value // the value
      );