我有一个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
,我需要在<num>
<read>
的值
我完成了以下代码
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();
这会为整个<book>
标记提供标识20
。从中我只能提取标记<num>
的值。
即我需要将值32
输入变量
答案 0 :(得分:2)
在尝试提取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");
答案 1 :(得分:1)
如果您没有使用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
做任何你喜欢的事情来获得它的价值等。
有用的参考: