我必须使用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 }
答案 0 :(得分:1)
首先,您要查询多个元素,因此您需要Elements
而不是Element
。 Element
只返回第一个项目,因此您的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