Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевод XML в структуру 
:(
    Опции темы
shtuceron
Дата 11.1.2012, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 17.2.2008

Репутация: нет
Всего: нет



Добрый день,

Сейчас столкнулся с задачей перевода xml в структуру. Например есть такой XML файл:

Код

<main>
<node1>
  <name>Name1</name>
  <value>Значение</value>
  </node>
<node2>
...
<nodeN>
...
<nodeN>
</main>


Мне нужно его трансформировать в структуру, поля структуры я сам определяю (они совпадают со значением узла name), и потом заполняю ее значениями поля value, структура имеет вид:

Код

public struct SomeStruct {
  public string Name1;
}


Я осуществляю парсинг этого XML файла и через switch (сравнивая поле и значение имени выделенного узла) провожу запись значений в структуру.

Это долго и если структуру я захочу расширить придется расширять switch это неэффективно, как можно решить задачу проще?

Спасибо.
PM MAIL WWW   Вверх
freezeman
Дата 12.1.2012, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Посмотри здесь msdn.microsoft...
PM MAIL   Вверх
Fortnox
Дата 12.1.2012, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 31.10.2008
Где: Ростов-на-Дону

Репутация: 14
Всего: 22



А обязательно структура? Можно использовать класс, реализующий интерфейс IXmlSerializable.
PM MAIL   Вверх
diadiavova
Дата 12.1.2012, 21:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



По моему самый разумный путь - это приведение хмл-документа к виду, пригодному для десериализации, то есть к такому
Код

<SomeStruct>
  <Name1>Value1</Name1>
  <Name2>Value2</Name2>
  <Name1>Value3</Name3>
</SomeStruct>

Если повлиять на структуру документа нельзя, а это очень желательно, поскольку называть фактически однотипные узлы(node1, node2 и т. д.) разными именами - в принципе плохая идея, тогда можно выполнить преобразование документа с помощью xslt, после чего таки выполнить десериализацию. XSLT будет иметь примерно следующий вид
Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <SomeStruct>
      <xsl:apply-templates select="main/*"/>
    </SomeStruct>
  </xsl:template>

  <xsl:template match="main/*">
    <xsl:element name="{name}">
      <xsl:value-of select="value"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>



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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0646 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.