c#从XML中选择属性或元素

时间:2015-08-05 05:27:19

标签: c# xml xpath attributes element

<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表达式一样?非常感谢!

2 个答案:

答案 0 :(得分:2)

这是否必须是XPath表达式,或者您可以将LinqXDocument系统一起使用。

例如。

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。

在小片段结束时,我们检查bookId0是否为零,我们可以假设出现问题。然而,这不应该发生,因为逻辑应该保持枚举并忘记没有bookID元素或bookID属性的元素。

答案 1 :(得分:2)

在XPath中,您可以使用union(|)运算符来组合返回XML的不同部分的查询。例如:

//book/bookID/text() | //book/@bookID

上述XPath按文档顺序返回bookID元素和bookID属性的文本内容。请参阅使用XmlDocument.SelectNodes()执行XPath的演示。

Demo Codes

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
相关问题