【问题标题】:How to query an embedded XML file using LINQ?如何使用 LINQ 查询嵌入式 XML 文件?
【发布时间】:2013-05-22 12:49:59
【问题描述】:

[C# .NET 4.0 WinForm LINQ]

我有一个 XML 文件作为 Content 添加到我的项目中,但我现在必须将其设置为内部的嵌入式资源,以便它可以与可执行文件一起编译,而我不必创建安装/deployment 应用程序包。

但是,我有使用 LINQ 来查询 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,它们使用程序集将文件读入字符串...这是我必须做的吗?不要进一步揭示我内心的菜鸟,但如果是这样的话,上面链接中的示例是否返回一个分隔字符串,我可以循环访问以便将项目添加到我的列表框?

谢谢...

【问题讨论】:

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


    【解决方案1】:

    将嵌入资源作为流打开:

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

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

    【讨论】:

    • 这需要引用 IO 和 Reflection 命名空间,对吧?另外,您能否详细介绍一下SomeTypeInTheAssembly
    • @user2063351:不,不需要using 指令。 SomeTypeInTheAssembly 的意义在于您选择了正确程序集中的 any 类型 - 您只是试图指定要从哪个程序集中获取流。所以这段代码出现的类型应该没问题,但是不知道叫什么...
    • 很抱歉我太密集了...有效的typeof(SomeTypeInTheAssembly) 是“XML”吗?如果我正在创建 Windows 窗体,我是否最适合使用 this.GetType().Assembly 而不是 typeof(SomeTypeInTheAssembly).Assembly
    • @user2063351:嗯,我不知道——你在正确的程序集中有一个名为XML 的类吗?如果它在实例方法中,你可以使用this.GetType(),当然。
    • 好的,这两个我都没有。如何找到要在程序集中使用的类型?当我将 XML 文件设置为嵌入式资源时,Visual Studio 是否应该在 AssemblyInfo.cs 文件中添加一些内容?
    【解决方案2】:

    根据 Jon Skeet 的回答,您可以使用 Assembly.GetExecutingAssembly() 让事情变得更简单:

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

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多