2016-09-17 2 views
2

私はWebプログラミングを初めて使い、.net 4.5から.net coreに切り替えることに決めました。MVCコア(1.0.0)でxmlドキュメントを読むには?

私のプロジェクトは、次の場所に静的なXML文書を持っています

wwwrootに/国/エンGB.xml

どのようにして指定されたパスにXMLファイルを読み込むに行きますか?最終的に私はそのデータをSelectListに変換します。

.net 4.5私はDataSetとHttpConextを使用しました。MapPathは、もはやコアmvc​​で動作しないxmlドキュメントを読み込みます。

アドバイスは大歓迎です。

答えて

5

まず、データソースは公開されているため、wwwrootフォルダには置かないでください。 official docsを見てみましょう:

のアプリのWebルートは、CSS、JS、画像ファイルなどの公共、 静的リソースのために、プロジェクトのディレクトリです。静的ファイル ミドルウェアは、デフォルトでWebルートディレクトリ(および サブディレクトリ)のファイルのみを処理します。

したがって、Countriesフォルダをプロジェクトのルートフォルダに移動します。

xmlデータを読むには、XmlSerializerを使用できます。私は、xmlファイルを読み取る方法を示すためにしようとします:

まず私はあなたが以下のようなXMLコンテンツを持っていると仮定します。

<?xml version="1.0" encoding="UTF-8" ?> 
<Container> 
    <Countries> 
    <Country> 
     <Code>Code1</Code> 
     <Title>Title1</Title> 
    </Country> 

    <Country> 
     <Code>Code2</Code> 
     <Title>Title2</Title> 
    </Country> 
    </Countries> 
</Container> 

まずタイプにその後

public class Country 
{ 
    public string Code { get; set; } 
    public string Title { get; set; } 
} 
public class Container 
{ 
    public Country[] Countries { get; set; } 
} 

を記述するXML直列化復元のためのサービスを作成します:

public interface ICountryService 
{ 
    Country[] GetCountries(); 
} 
public class CountryService : ICountryService 
{ 
    private readonly IHostingEnvironment _env; 
    public CountryService(IHostingEnvironment env) 
    { 
     _env = env; 
    } 
    public Country[] GetCountries() 
    { 
     XmlSerializer ser = new XmlSerializer(typeof(Container)); 
     FileStream myFileStream = new FileStream(_env.ContentRootPath + "\\Countries\\en-GB.xml", FileMode.Open); 
     return ((Container)ser.Deserialize(myFileStream)).Countries; 
    } 
} 

ConfigureServicesの方法で登録サービス:

public void ConfigureServices(IServiceCollection services) 
    { 
     // ... 
     services.AddSingleton<ICountryService, CountryService>(); 
    } 

最後に注入し

public class SomeController : Controller 
{ 
    public SomeController(ICountryService countryService) 
    { 
     // use it 
    } 
} 
+0

本当に素晴らしいと詳細な回答(例えばコントローラのように)どこにでもそれを使用します。あなたのソリューションは完璧に機能します。なぜ私がエラーを起こしているのかを理解するためにはいくつかの試みが必要でしたが、それは私のXMLデータ構造のためでしたが、今は明らかです。私は包括的な答えを提供するあなたの時間を非常に感謝します。 – RobHurd

+0

以前のバージョンのasp.netの属性を使用していない場合は、これは良い答えです。属性を使用してデータメンバーに属性をマップしました。これをコアでどのように達成するのですか? – phitch