我试图根据值获取相关的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");
}
答案 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
);