<bookstore>
<book>
<bookID>100</bookID>
<name> The cat in the hat </name>
</book>
<book>
<bookID>90</bookID>
<name> another book </name>
</book>
<book>
<bookID>103</bookID>
<name> a new book </name>
</book>
</bookstore>
我试图从XML文档中选择bookID值。我目前使用的方法是Element(bookID).Value
但有时bookID作为书的属性出现如下:<book bookID=100>
是否存在在c#中这样做的方法,就像xPath表达式一样?非常感谢!
答案 0 :(得分:2)
这是否必须是XPath表达式,或者您可以将Linq
与XDocument
系统一起使用。
例如。
var xDocument = XDocument.Parse(@"<bookstore>
<book>
<bookID>100</bookID>
<name> The cat in the hat </name>
</book>
<book bookID=""90"">
<name> another book </name>
</book>
<book>
<bookID>103</bookID>
<name> a new book </name>
</book>
</bookstore>");
foreach (var xBook in xDocument.Descendants("book"))
{
var bookIdNode = xBook.Elements("bookID").FirstOrDefault();
int bookId = 0;
///there is a book id as an element
if (bookIdNode != null)
{
//invalid book id.. should be an int
if (!int.TryParse(bookIdNode.Value, out bookId))
continue;
}
else
{
var bookIdAttr = xBook.Attributes("bookID").FirstOrDefault();
if (bookIdAttr == null || !int.TryParse(bookIdAttr.Value, out bookId))
continue;
}
if (bookId == 0)
continue;
//else we got our book id
}
此代码非常简单,只需枚举元素名称为book
的后代。它首先检查是否存在名为bookID
的元素(区分大小写)。如果有,则尝试使用int
方法将图书ID解析为int.TryParse()
。
如果没有bookID
元素,则接下来检查是否存在名称为bookID
的任何属性,并使用FirstOrDefault()
扩展方法获取第一个实例(或null)。如果存在bookID
属性的实例,它还会尝试使用int.TryParse()
方法解析int。
在小片段结束时,我们检查bookId
是0
是否为零,我们可以假设出现问题。然而,这不应该发生,因为逻辑应该保持枚举并忘记没有bookID
元素或bookID
属性的元素。
答案 1 :(得分:2)
在XPath中,您可以使用union(|
)运算符来组合返回XML的不同部分的查询。例如:
//book/bookID/text() | //book/@bookID
上述XPath按文档顺序返回bookID
元素和bookID
属性的文本内容。请参阅使用XmlDocument.SelectNodes()
执行XPath的演示。
var xml = @"<bookstore>
<book>
<bookID>100</bookID>
<name> The cat in the hat </name>
</book>
<book bookID='90'>
<name> a new book </name>
</book>
<book>
<bookID>103</bookID>
<name> another book </name>
</book>
</bookstore>";
var doc = new XmlDocument();
doc.LoadXml(xml);
var result = doc.SelectNodes("//book/bookID/text() | //book/@bookID");
foreach (XmlNode r in result)
{
Console.WriteLine(r.Value);
}
输出
100
90
103