Преобразование этого XML-файла в словарь?

#c# #xml #parsing #dictionary #xna

#c# #xml #синтаксический анализ #словарь #xna

Вопрос:

Я очень новичок в сериализации XML, до сих пор я использовал XDocument и перебирал XML-файл для загрузки содержимого. Я знаю, что есть способ сериализовать XML-файлы, недавно я наткнулся на следующий фрагмент XML:

 <?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
<Asset Type="System.Collections.Generic.Dictionary[System.String, Microsoft.Xna.Framework.Rectangle]">
<Item><Key>frame0</Key><Value>0 0 128 128</Value></Item>
<Item><Key>frame1</Key><Value>128 0 128 128</Value></Item>
</Asset>
</XnaContent>
  

И пытался выяснить, как бы я загрузил это и проанализировал в словаре, верхняя часть с указанием типа ресурса =System.collections.generic.dictionary, похоже, предполагает, что я смогу быстро преобразовать это в словарь.

Итак, мой вопрос в том, как мне это сделать? Я мог бы легко выполнить итерацию по структуре xml и сопоставить ключи со значениями, но, похоже, был бы лучший способ сделать это?

Ответ №1:

Это на удивление просто. Добавьте XML-файл в свой контент-проект. Сохраните импортер по умолчанию («Содержимое XML») и процессор (отсутствует).

Конвейер содержимого XNA встроит его в XNB файл для вас.

Затем просто загрузите его с помощью ContentManager.Load , как и любой другой ресурс:

 var myContent = Content.Load<Dictionary<string, Rectangle>>("MyXmlFile");
  

Ответ №2:

РЕДАКТИРОВАТЬ: Только что просмотрев эту статью и эту, я подозреваю, что вы хотите использовать либо IntermediateSerializer , либо XmlImporter .

Я не являюсь разработчиком XNA, и мне непонятно, как все это сочетается, но, надеюсь, этого достаточно, чтобы вы начали.

Конечно, если это был просто пример XML, и вы действительно хотите сериализовать данные, которые не являются частью XNA, вы можете захотеть взглянуть на XmlSerializer . Лично я обнаружил, что проще управлять сериализацией вручную, используя LINQ to XML — таким образом проще управлять различными версиями и т.д., Но в некоторых случаях XmlSerializer Было бы удобнее.