如何使用LINQ查询嵌入式XML文件?

时间:2013-05-22 12:50:00

标签: c# .net winforms linq linq-to-xml

[C#.NET 4.0 WinForm LINQ]

我有一个XML文件,我作为Content添加到我的项目中,但我现在必须将其作为内部嵌入式资源,因此它将使用可执行文件进行编译,我不必创建应用程序的安装/部署包。

但是,我现有的代码使用LINQ来查询XML文件,因为我已经将文件设置为嵌入式资源。 如果XML文件是嵌入式资源而不是内容资源,那么我需要做些什么才能查询XML文件?我见过一些

在查询XML文件后,我遍历结果并将它们加载到列表框中。这是我用来查询XML文件的代码,当它设置为Content并将我的循环添加到列表框时:

var computers = from e in XElement.Load(@"MyXML.xml").Elements("computer")
        select (string)e.Element("name");

foreach (var c in computers)
{
    if (!IsNullOrEmpty(computer))
    {
        lstComputer.BeginUpdate();
        lstComputer.Items.Add(computer);
        lstComputer.EndUpdate();
    }
}

我已经看到了一些其他的例子,比如this one,它们使用程序集将文件读入字符串......这就是我要做的事情吗?不要进一步揭示我的内部菜鸟,但如果是这种情况,上面链接中的示例是否返回一个我可以循环的分隔字符串,以便我可以将项目添加到我的列表框中?

...谢谢

2 个答案:

答案 0 :(得分:3)

以流形式打开嵌入式资源:

XElement doc;
using (var stream = typeof(SomeTypeInTheAssembly).Assembly
                        .GetManifestResourceStream("MyXML.xml"))
{
    doc = XElement.Load(stream);
}

无需通过中间字符串表示。

答案 1 :(得分:0)

根据Jon Skeet的回答,您可以使用Assembly.GetExecutingAssembly()来简化操作:

using System.Reflection;

XElement doc;
using (var stream = Assembly.GetExecutingAssembly().
                    .GetManifestResourceStream("MyNameSpace.MyXML.xml"))
{
    doc = XElement.Load(stream);
}