从XML文档中获取Node值

本文关键字:Node 获取 XML 文档 | 更新日期: 2023-09-27 18:13:59

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

XmlDocument xdoc = new XmlDocument();
xdoc.Load("filepath");
XmlNodeList nodes = xdoc.SelectNodes("//gesmes/gesmes");
foreach (XmlNode node in nodes)
{
   Console.WriteLine(node["currency"]);
}

我的Xml文档看起来像这样

<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01"
    xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
  <gesmes:subject>Reference rates</gesmes:subject>
  <gesmes:Sender>
    <gesmes:name>European Central Bank</gesmes:name>
  </gesmes:Sender>
  <Cube>
    <Cube time="2014-07-21">
      <Cube currency="USD" rate="1.3518"/>
      <Cube currency="JPY" rate="136.97"/>
      <Cube currency="BGN" rate="1.9558"/>
    </Cube>
  </Cube>
</gesmes:Envelope>

从XML文档中获取Node值

你的代码有很多问题:

<标题> 名称空间

您必须添加一个命名空间管理器并添加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 h1> 要选择什么?
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();