簡體   English   中英

C#從XML選擇屬性或元素

[英]c# select attribute or element from XML

<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屬性: <book bookID=100>有沒有辦法在c#中做到這一點,也許像xPath表達式? 非常感謝!

這需要是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.TryParse()方法將圖書ID解析為一個int

如果沒有bookID元素,則接下來檢查是否存在名稱為bookID屬性,並使用FirstOrDefault()擴展方法FirstOrDefault()第一個實例(或null)。 如果存在bookID屬性的實例,它還嘗試使用int.TryParse()方法解析int。

在小片段的結尾,我們然后檢查bookId是否為0如果為零,則可以假設出現問題。 但是,這不應該發生,因為邏輯應繼續枚舉,並bookID沒有bookID元素或bookID屬性的Elements。

在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM