簡體   English   中英

Linq到元素內部的XML元素

[英]Linq to XML Element inside Element

我編寫了一種讀取XML並將信息寫入對象的方法。 XML包含具有信息的元素,但是其中一些信息已封裝,我無法弄清楚如何從中獲取信息。 XML包含大約200個“結果”。

XML結構

 <result id="xxxxx">
      <name>Name</name>
      <age>25</age>
      <info>
           <x>Some text</x>
           <y>More Text</y>
      </info>
 </result>

XDocument rootDocument = XDocument.Load(file);
var xy = from r in rootDocument.Descendants("result")
        select new
        {
            Name = r.Element("name")
            Age = r.Element("age"),
            x = r.Element("info").Element("x"),
            y = r.Element("info").Element("y"),
        };

foreach (var r in xy)
{
    Object o = new Object()
    {
        Name = r.Name,
        Age = r.Age,
        x = r.x,
        y = r.y
    };
}

錯誤對象引用未設置為對象的實例。

錯誤發生在該行

  x = r.Element("info")...

和下面的一個。

您可以執行以下操作:

var query = from r in rootDocument.Descendants("result")
            select new
            {
                Name = (string)r.Element("name"),
                Age = (int?)r.Element("age"),
                x = (string)r.Elements("info").Elements("x").SingleOrDefault(),
                y = (string)r.Elements("info").Elements("x").SingleOrDefault(),
            };
var resultList = query.ToList();

筆記:

  • 選擇具有基本值的XElement ,可以將元素轉換為ac#基本值,例如stringint? 通過使用XElement顯式轉換運算符之一 ,如下所示:

     Name = (string)r.Element("name") Age = (int?)r.Element("age") 
  • 您看到未將對象引用設置為對象異常實例的事實表明,元素意外丟失。 如果<result>元素之一缺少<info>子元素,則很容易發生這種情況。 表達方式

     r.Elements("info").Elements("x") 

    返回名為<info>的子元素的所有名為<x>的子元素。 然后, SingleOrDefault()返回該序列的唯一元素;如果序列為空,則返回默認值。 這樣可以防止<info>丟失時的情況。

  • 同樣,如果缺少<age>元素,則嘗試將其強制轉換為int會拋出空引用異常,因為int是一種值類型。 轉換為int? 而是返回null而不是引發異常。

  • 最終的ToList()評估查詢並以列表形式返回結果。

樣品提琴

暫無
暫無

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

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