我有这个XML块:
<Books>
<BookData id="BookID_100">
<Name>The Catcher and the Rye</Name>
<Description>This is a neat book that you might have had to read in school</Description>
<Date>1/1/1900</Date>
<IsHardcover>1</IsHardcover>
</BookData>
<BookData id="BookID_101">
<Name>Harry Potter</Name>
<Description>J.K. Rowlings Fantasy Epic</Description>
<Date>1/1/2000</Date>
<IsHardcover>0</IsHardcover>
</BookData>
</Books>
我正在将一本“书”作为IEnumerable读入内存:
IEnumerable<XElement> book =
from el in root.Elements("BookData")
where (string)el.Attribute("id") == "BookID_100"
select el;
现在,从这里开始,如何根据标签检索值?说,我想要'姓名'数据。如何获得包含内容的字符串“The Catcher and The Rye”?这似乎应该很简单,但是我所看到的一切都是非常深奥和笨拙的,当我想做的就是
// Pseudo Code
string bookName = book.GetElementByID("Name").ToString();
答案 0 :(得分:3)
当您只想要具有指定ID的图书时,为什么要获得图书元素的集合?如果您只想要一本书,可以使用FirstOrDefault()
请改为尝试:
//This will return the first book matching: "BookID_100" or NULL
var book = root.Elements("BookData")
.FirstOrDefault(x => x.Attribute("id") == "BookID_100");
//'name' will be null if book or name is null, or the name of the book element
string name = book?.Element("Name")?.Value;
如果您没有使用C#6或更高版本,则?.
运算符将无法使用,在这种情况下,只需像往常一样检查null:
string name = string.Empty;
if(book != null && book.Element("Name") != null)
{
name = book.Element("Name").Value;
}
答案 1 :(得分:1)
您必须调用Element
方法,并从XElement
传递您想要获取的元素名称:
IEnumerable<XElement> book =
from el in root.Elements("BookData")
where el.Attribute("id").Value == "BookID_100"
select el.Element("Name");
这将只返回您节点的元素Name
。您可以进一步调用.Value
属性,以获取Name
代码的开始和结束标记之间的文字。
如果您只需要一本书,因为看起来您会得到一本书,而您需要写一本书:
var book =
(from el in root.Elements("BookData")
where el.Attribute("id").Value == "BookID_100"
select el).FirstOrDefault();
if(book !=null)
{
string Name = book.Element("Name").Value;
}