如何使用 C# 在 xml 中获取特定的子节点值

how to take a specific child node value in xml using C#

我有一个 xml 架构,如下所示

<library>
    <book>
      <id>1</id>
      <name>abc</name>
        <read>
          <data>yes</data>
          <num>20</num>
       </read>
    </book>
    <book>
      <id>20</id>
      <name>xyz</name>
        <read>
          <data>yes</data>
          <num>32</num>
       </read>
    </book>
</library>

现在如果 id20 我需要在 <read>

下获取标签 <num> 的值

我完成了如下代码

 var xmlStr = File.ReadAllText("e_test.xml");
 var str = XElement.Parse(xmlStr);
 var result = str.Elements("book").Where(x => x.Element("id").Value.Equals("20")).ToList();

这给出了 ID 为 20 的整个 <book> 标签。从这个我怎么能只提取标签 <num>.

的值

即我需要将值 32 放入变量

在尝试提取 num 值之前,您需要修复 Where 子句 - 此时您正在将字符串与整数进行比较。最简单的修复 - 如果您知道您的 XML 将始终有一个 id 元素,其文本值为整数 - 是将该元素转换为 int.

接下来,我将使用 SingleOrDefault 来确保最多只有一个这样的元素,假设这是您的 XML 文档应该包含的元素。

然后你只需要使用Element两次通过read然后num向下导航,然后将结果再次转换为int

// Or use XDocument doc = ...; XElement book = doc.Root.Elements("book")...
XElement root = XElement.Load("e_test.xml")
XElement book = root.Elements("book")
                    .Where(x => (int) x.Element("id") == 20)
                    .SingleOrDefault();
if (book == null)
{
    // No book with that ID
}
int num = (int) book.Element("read").Element("num");

如果您不打算使用 Linq,那么这个 XPath 怎么样? XPath 可能被更广泛地理解,而且非常简单。用于查找节点的 XPath 为:

/library/book[id=20]/read/num

您可以在 C# 中使用:

var doc = new XmlDocument();
doc.LoadXml(myString);
var id = 20;
var myPath = "/library/book[id=" + id + "]/read/num";

var myNode = doc.SelectSingleNode(myPath);

然后你可以用myNode做任何你想做的事情来获得它的价值等..

有用的参考:

http://www.w3schools.com/xsl/xpath_syntax.asp