Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Перевод XML в структуру


Автор: shtuceron 11.1.2012, 14:38
Добрый день,

Сейчас столкнулся с задачей перевода 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 это неэффективно, как можно решить задачу проще?

Спасибо.

Автор: freezeman 12.1.2012, 09:37
Посмотри здесь http://msdn.microsoft.com/ru-ru/library/zx28tfx1.aspx...

Автор: Fortnox 12.1.2012, 19:09
А обязательно структура? Можно использовать класс, реализующий интерфейс IXmlSerializable.

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

<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 и добавить пары имя-значения в словарь, после чего обходить все поля структуры и брать их значения из словаря. Поля обойти можно с помощью рефлексии, чтобы не перечислять их поименно в коде.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)