我有一个XML文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="publisher" type="KP.Common.Util.XamlConfigurationSection, KP.Common"/>
</configSections>
<publisher>
<p:Publisher xmlns:p="http://schemas.KP.com/xaml/common/notification">
<p:KPLogSubscriber MinimumImportance="Information" />
<p:EventLogSubscriber MinimumImportance="Warning" Source="KPTTY" Log="Application" />
<p:DatabaseMailSubscriber xmlns="http://schemas.KP.com/xaml/data/ef" MinimumImportance="Error" ProfileName = "" Recipients = "administrator@firm.com" Subject = "KPTTY Error" />
</p:Publisher>
</publisher>
</configuration>
我正在尝试使用此代码读取关键收件人的值:
XmlDocument config = new XmlDocument();
config.Load(configPath);
XmlNode node = config.SelectSingleNode(@"/*[local-name() = 'configuration']/*[local-name() = 'publisher']/*[local-name() = 'Publisher']/*[local-name() = 'DatabaseMailSubscriber']/@Recipients");
Console.WriteLine(node.Value);
但是我得到一个异常(节点为null)。我的Xpath有什么问题吗?我试图忽略xml中可能不存在的任何名称空间。
答案 0 :(得分:1)
如果可以使用Linq2Xml
XDocument xDoc = XDocument.Load(fname);
var recipients = xDoc.Descendants()
.First(d => d.Name.LocalName == "DatabaseMailSubscriber")
.Attribute("Recipients")
.Value;
答案 1 :(得分:0)
您忘了为“收件人”执行local-name
。 “Recipients”属性具有空前缀,意味着其名称空间为xmlns="http://schemas.KP.com/xaml/data/ef"
,如“DatabaseMailSubscriber”元素所定义。
即。如果你不关心路径,你可以简单地使用“//”代表“任何孩子:
"//*[local-name() = 'DatabaseMailSubscriber']/@*[local-name() = 'Recipients]"
注意:请考虑实际正确使用命名空间...或按照L.B。
的建议使用XDocument