1

Here's an outline of my solution:

enter image description here

I've set the build to Embedded Resource and when I generate the application the XML file doesn't appear in the /Release folder. This is correct, I want this behavior.

Now I'm trying to load that file into an XDocument so I can parse the data within:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Parsing XML.");

        XDocument championXml = XDocument.Load("Champions.xml");

        Console.ReadKey();
    }
}

And I get a file not found error because it's trying to find the xml file in the full path of the release folder.

How can I properly load this data into my XDocument?

Only Bolivian Here
  • 35,719
  • 63
  • 161
  • 257

3 Answers3

6

Reference the resource property directly and use Parse instead of load:

XDocument championXml = XDocument.Parse(Properties.Resources.ChampionsXML);
                                                             ^^^^^^^^^^^^
                                           //Name of your resource |

The namespace will be somewhat different depending on your project structure.

D Stanley
  • 149,601
  • 11
  • 178
  • 240
4

Use GetManifestResourceStream():

var asm = Assembly.GetExecutingAssembly();
using(var stream = asm.GetManifestResourceStream("Namespace.Champions.xml"))
{
    // ...
}

The exact names used to reference resources can be found by calling GetManifestResourceNames().

Cole Campbell
  • 4,846
  • 1
  • 17
  • 20
  • I'm using .NET 3.5, and it seems the `XDocument.Load(stream)` is only available for .NET 4 and up. I can't use it in my application. How do I use this stream and turn it into xml? http://msdn.microsoft.com/en-us/library/cc838349%28v=vs.95%29.aspx – Only Bolivian Here Dec 06 '11 at 21:09
  • Found my answer in another question. Thanks! Will mark this as answer. http://stackoverflow.com/questions/3281714/how-to-read-xml-file-using-system-io-stream-with-linq – Only Bolivian Here Dec 06 '11 at 21:13
1

You should get stream from assembly:

Assembly.GetExecutingAssembly().GetManifestResourceStream(name)

Where name will be something like: 'LinqToXml.Champions.xml'

Krzysztof
  • 15,900
  • 2
  • 46
  • 76