Десериализация XML-массивов - PullRequest
2 голосов
/ 09 декабря 2010

У меня есть XML-файл, который я пытаюсь десериализовать с помощью класса .Net XmlSerializer.У меня проблемы с созданием класса C #, который представляет формат XML.Моя основная проблема связана с одним элементом, который используется для представления универсального массива.Подэлементы массива не всегда одинаковы.У меня также возникает проблема с массивами массивов, которые, как я читал, изначально не поддерживаются.

Пример:

<root>
    <parent_1>
        <sub_element0 value="0"/>
        <sub_element1>
            <array idx="0" value="0"/>
            <array idx="1" value="0"/>
        </sub_element1>
    </parent_1>
    <parent_2>
        <array idx="0">
            <array idx="0">
                <sub_element2 value="0"/>
            </array>
            <array idx="1">
                <sub_element2 value="0"/>
            </array>
        </array>
        <array idx="1">
            <array idx="0">
                <sub_element2 value="0"/>
            </array>
            <array idx="1">
                <sub_element2 value="0"/>
            </array>
        </array>
    </parent_2>
</root>

Как видите, элемент массива используется сбез подэлементов и с подэлементами (включая себя).Я не могу просто создать класс с именем «массив», так как мне с этим справиться?

Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 09 декабря 2010

Запустите xsd.exe для соответствующего XML, чтобы создать XSD. Затем запустите xsd.exe / c на сгенерированном XSD, чтобы создать классы сериализации / десериализации. Вы заметите, что он создает не класс с именем array, а array1, а затем применяет к нему XmlElementAttribute с XML-именем «array».

1 голос
/ 19 января 2011

xsd.exe не поддерживает экземпляры XML, где некоторый подузел имеет то же имя, что и узел выше.В этом случае у вас есть «массив» с дочерним элементом с тем же именем (дифференцируется с помощью свойства «idx»).Это известная проблема, и, поскольку она известна годами, я бы не стал задерживать дыхание, когда она сортируется.

Сегодня я столкнулся с тем же, и сейчас я пытаюсь найти решение.Если я снова найду эту страницу, я обновлю.

ОБНОВЛЕНИЕ: Мое решение состояло в том, чтобы написать свои собственные классы десериалеров, XML-код, который я получал, был не очень хорош, имея повторяющиеся элементы внутри элементов & c.Я выбрал некоторые классы, которые повторялись через XML, извлекая элементы - очень быстро, легко и приятно.

Однако, если это не хорошо для вас, попробуйте следующее:

  1. Загрузите файл trang.jar (это Java XSD из XML-модуля) (Google для определения местоположения)
  2. Запустите его в своем XML-файле, например, так: 'java -jar trang.jar
  3. Это дает вамXSD-файл
  4. Прибавьте это к XSD.exe с помощью 'xsd / classes'

У вас будет что-то не очень хорошее, но оно будет работать.

...