[英]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表達式嗎,還是可以將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.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.