如何使用 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>
现在如果 id
是 20
我需要在 <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
做任何你想做的事情来获得它的价值等..
有用的参考:
我有一个 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>
现在如果 id
是 20
我需要在 <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
做任何你想做的事情来获得它的价值等..
有用的参考: