XDocument C#加入

时间:2017-06-19 15:39:15

标签: c# xml linq

我必须使用XDocument

为以下xml使用连接
<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,但它们存在于两个不同的记录下,即图书馆和书籍。 我使用此代码,但加入对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 }

2 个答案:

答案 0 :(得分: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了解演示。

答案 1 :(得分:0)

根据您显示的xml架构,库与书籍处于同一级别,如果您使用Descendants方法,它会更容易,而不是使用Attribute,请使用{{1因为Element在两种情况下都不是属性:

CardNo