2017-06-19 67 views
0

我必須使用連接使用的XDocument的XDocument C#加入

<Books> 
    <Book> 
     <Name id="1">Test</Name> 
     <CardNo>1234</CardNo> 
    </Book> 
    <Book> 
     <Name id="1">Test</Name> 
     <CardNo>5678</CardNo> 
    </Book> 
    <Library> 
     <RackNo>4</RackNo> 
     <SampleData>Hello</SampleData> 
     <CardNo>1234</CardNo> 
    </Library> 
    <Library> 
     <RackNo>5</RackNo> 
     <SampleData>John</SampleData> 
     <CardNo>5678</CardNo> 
    </Library> 
</Books> 

在上面的示例中,我需要加入CardNo下面的XML,但他們是在兩個不同的記錄本..即圖書館和圖書。 我正在使用此代碼,但連接不適用於XDocument。 有什麼建議嗎?

var bookRecords = from c in doc.Element("Books").Element("Book") 
        select new { bookCardNo = c.Attribute("CardNo").Value } 

var LibraryRecords = from d in doc.Element("Books").Element("Library") 
        select new { libCardNo = d.Attribute("CardNo").Value } 

var groupedRecords = 
    from br in bookRecords 
    join lr in LibraryRecords 
    on br.bookCardNo equals lr.libCardNo 
    select new { rackno = lr.Element("RackNo").Value } 

回答

1

首先,你查詢多個元素,所以你要Elements,而不是ElementElement只會返回第一項,所以你的LINQ表達式不會編譯。

其次,沒有屬性稱爲CardNo - CardNo元件

最後,LibraryRecords將包含一堆匿名對象。如果您想訪問RackNo或任何其他屬性,則需要將它們的值包含爲該對象的屬性。

var bookRecords = 
    from book in doc.Elements("Books").Elements("Book") 
    select new 
    { 
     Name = (string) book.Element("Name"), 
     CardNo = (string) book.Element("CardNo") 
    }; 

var libraryRecords = 
    from lib in doc.Elements("Books").Elements("Library") 
    select new 
    { 
     CardNo = (string) lib.Element("CardNo"), 
     RackNo = (string) lib.Element("RackNo"), 
    }; 

var groupedRecords = 
    from br in bookRecords 
    join lr in libraryRecords 
    on br.CardNo equals lr.CardNo 
    select new 
    { 
     br.Name, 
     lr.RackNo 
    }; 

查看this fiddle的演示。

+0

謝謝查爾斯。這工作:) –

0

庫是在同一水平比書根據您展示XML模式,如果使用Descendants方法,而改用Attribute,使用它會更容易Element因爲CardNo是不是在這兩個屬性案例:

var bookRecords = from c in doc.Descendants("Book") 
        select new { bookCardNo = c.Element("CardNo").Value }; 

var LibraryRecords = from d in doc.Descendants("Library") 
        select new { libCardNo = d.Element("CardNo").Value, 
            rackno = d.Element("RackNo").Value }; 

var groupedRecords = 
    from br in bookRecords 
    join lr in LibraryRecords 
    on br.bookCardNo equals lr.libCardNo 
    select lr.rackno;