从IEnumerable <xelement>中读取特定元素

时间:2018-01-05 21:52:59

标签: c# xml linq

我有这个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();

2 个答案:

答案 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;
 }