从XML文档获取节点值

时间:2014-07-22 10:36:27

标签: c# xml parsing

我的代码看起来像这样,我想打印货币的价值,但我不知道我错在哪里我的Xml文档看起来像这样

XmlDocument xdoc = new XmlDocument();
xdoc.Load("filepath");
XmlNodeList nodes = xdoc.SelectNodes("//gesmes/gesmes");

foreach (XmlNode node in nodes)
{
   Console.WriteLine(node["currency"]);
}

1 个答案:

答案 0 :(得分:3)

您的代码存在多处问题:

命名空间

您必须添加命名空间管理器并添加xml中定义的命名空间

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
nsmgr.AddNamespace("gesmes", "http://www.gesmes.org/xml/2002-08-01");
nsmgr.AddNamespace("lo", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref");

注意我是如何添加带有lo别名的默认命名空间,以便稍后可以使用XPath查询它

的XPath

你想要选择什么?
gesmes是文档中的命名空间,而不是您可以选择的节点。根据您的问题,我猜您要选择包含货币属性的多维数据集,如下所示:

XmlNodeList nodes = xdoc.SelectNodes("//lo:Cube[@currency]", nsmgr);

请注意,您需要包含命名空间管理器

您要查找的值不是Node Value

<Cube currency="USD">1.3518</Cube>

将是属性值
使用

选择它
node.Attributes["currency"].Value;

放在一起

XmlDocument xdoc = new XmlDocument();
xdoc.Load("filepath");
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
nsmgr.AddNamespace("gesmes", "http://www.gesmes.org/xml/2002-08-01");
nsmgr.AddNamespace("lo", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref");
XmlNodeList nodes = xdoc.SelectNodes("//lo:Cube[@currency]", nsmgr);

foreach (XmlNode node in nodes)
{
    Console.WriteLine(node.Attributes["rate"].Value);
}

Console.ReadKey();