プロジェクトのフォルダーにあるXMLファイルを読み込もうとしています(Visual Studio 2012を使用)。
構造はこれです:
solutionRoot\
- service\
-- ServiceClass.cs
-- AppValues.xml <-- this is the file I want to load
私のServiceClassでは、次のコードを使用してXMLファイルから読み取ろうとしています。
public String GetXmlElement(String elementName)
{
[....]
XDocument document = XDocument.Load(@"\service\AppValues.xml");
[...]
}
コードをテストしようとすると、次のエラーが発生します。
Test method PandaTests.ServiceTest.ReadXmlCanReadXml threw exception:
System.IO.DirectoryNotFoundException: Could not find a part of the path
'C:\Users\MyName\Documents\GitHub\project\Project22\PandaTests\bin\Debug\service\AppValues.xml'.
これは明らかに私のパスの問題ですが、相対パスを正しく設定する方法がわかりません。ここでスタックオーバーフローに関する他の質問を見ましたが、それらの多くは過度に関与しているようです。絶対パスを指定せずにXMLファイルをロードする簡単な方法はありますか?
VSがプログラムを実行すると、作業ディレクトリはソリューションルートではなく、Debug/Releaseフォルダーに設定されます。
私が知っているいくつかのオプションがあります...
私は同じ問題に直面し、「Server.MapPath」を使用してそれを解決しました
例えば、
string path=Server.MapPath("~/service/AppValues.xml");
XDocument document = XDocument.Load(path);
それが役に立てば幸い。
AppValues.xmlのVisual Studioのプロパティを表示します。 「出力ディレクトリにコピー」を「新しい場合はコピー」に変更して、プロジェクトをビルドします。
これをチェックして
XDocument document = XDocument.Load(@"..\service\AppValues.xml");
2つのステップで解決しました。私はMVCを使用しており、これをクラスファイルで使用する必要がありました。
1)文字列パス
=HttpContext.Current.Server.MapPath("~/App_Data/yourxmlfilename.xml");
XDocument doc = XDocument.Load(path);
2)XMLファイルのプロパティを変更する
ビルドアクション:コンテンツ
出力ディレクトリにコピー:常にコピー
Xmlファイルのビルドアクションを「組み込みリソース」に設定し、このコードを使用して参照します
private static UnmanagedMemoryStream GetResourceStream(string resName)
{
var Assembly = Assembly.GetExecutingAssembly();
var strResources = Assembly.GetName().Name + ".g.resources";
var rStream = Assembly.GetManifestResourceStream(strResources);
var resourceReader = new ResourceReader(rStream);
var items = resourceReader.OfType<DictionaryEntry>();
var stream = items.First(x => (x.Key as string) == resName.ToLower()).Value;
return (UnmanagedMemoryStream)stream;
}
var file = GetResourceStream("appValues.xml");
Visual Studioプロジェクトにファイルを追加する場合、デフォルトでは、生成された出力にコピーされません。そのため、ファイルをコピーするか、手動でコピーするように設定する必要があります。
ファイルを自動的にコピーするように設定するには、ソリューションエクスプローラーでファイルを選択し、右クリックしてプロパティを選択します。 「出力ディレクトリにコピー」の値を「常にコピー」に更新します。これにより、実行時に結果のソリューションのサブフォルダーでファイルのコピーを利用できるようになります。
次に、次のようなものを使用してファイルをロードできます。
string path = System.Io.Path.Combine(Application.StartupPath, @"\service\AppValues.xml");
XDocument doc = XDocument.Load(path);