pau*_*aul 5 linq-to-xml linq-to-sql
XML:
<root>
<item>
<href>http://myurl</href>
</item>
<item>
<href>http://myurl2</href>
</item>
</root>
Run Code Online (Sandbox Code Playgroud)
XML数据存储在数据库表中.
我可以构建一个Linq查询来选择行,提取XML然后,例如,提取所有的href标签吗?最终结果将是所有选定行的所有URL的列表.
这是我的尝试,但它没有给我我想要的东西 - 这将是所有选定用户的所有href的列表.我只是得到一个空的IEnumerations列表.
var all = from bm in MYTABLE
select new { name=bm.SPP_USER_ID, xml=(string) bm.SPP_BOOKMARKS_XML};
var docs = from x in all
select XDocument.Parse(x.xml);
var href = from h in docs
select h.Descendants("href");
Run Code Online (Sandbox Code Playgroud)
有2个问题.
- 我想只有在实际需要结果时才会执行查询.随着我从SQL进展到XML查询,生成的查询变成了SQL和XML的混合,因此是不可执行的.我的解决方案是通过将SQL查询转换为结果列表来强制执行结果.这将linq-sql与linq-xml分开.
var docs = from x in all
select XDocument.Parse(x.xml);
var docs2 = docs.ToList(); // force result
Run Code Online (Sandbox Code Playgroud)
- 第二个问题是我忘了将命名空间添加到我的XML查询中.一旦我这样做,我得到了所需的结果
XNamespace ns = "http://acme/bookmarks";
var href = from h in docs2
select h.Descendants(ns + "href");
Run Code Online (Sandbox Code Playgroud)
感谢你的帮助!
这是一个使用您的代码和 的硬编码内容的代码片段MYTABLE
,并且它运行完美(使用 LinqPad 进行了验证)。也许您的数据库表MYTABLE
不包含您认为的内容?你能检查一下结果吗all
?
var MYTABLE = new [] {
new {
SPP_USER_ID = "XML-SNIPPET-1",
SPP_BOOKMARKS_XML = @"
<root>
<item>
<href>http://myurl</href>
</item>
<item>
<href>http://myurl2</href>
</item>
</root>
",
},
new {
SPP_USER_ID = "XML-SNIPPET-2",
SPP_BOOKMARKS_XML = @"
<root>
<item>
<href>http://google.com</href>
</item>
</root>
",
}
};
var all = from bm in MYTABLE
select new { name=bm.SPP_USER_ID, xml=(string) bm.SPP_BOOKMARKS_XML};
var docs = from x in all
select XDocument.Parse(x.xml);
var href = from h in docs
select h.Descendants("href");
foreach (var h in href.SelectMany(h => h))
{
Console.WriteLine(h);
}
Run Code Online (Sandbox Code Playgroud)
输出:
<href>http://myurl</href>
<href>http://myurl2</href>
<href>http://google.com</href>
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
归档时间: |
|
查看次数: |
6183 次 |
最近记录: |