Динамическое сопоставление полей xml со статическим объектом - PullRequest
0 голосов
/ 19 августа 2011

Я хотел бы предоставить пользователю визуальное DOM-подобное представление структуры XML (в данном случае заполненную форму infopath) и позволить ему указать, какие элементы данных xml они хотят отобразить в статически скомпилированный объект.

В качестве примера, у пользователя есть форма информационного пути, которая позволяет ему заключить коммерческую сделку, она заполняет ее и отправляет, приложение должно позволить им видеть структуру данных в форме информационного пути (в дружественномвид дерева) и укажите, как он должен отображаться в статическое представление сделки по продаже (подумайте о строке, которая может идти в таблице «Сделки»).

Формы Infopath (источник xml) не являютсяконтролируется мной.

Я ищу предложения о том, как отобразить древовидную структуру XML и разрешить взаимодействие с ним, чтобы указать отображение (возможно, перетаскивание?).

Это будетбыть в приложении wpf (я знаю, что мне придется разместить элемент управления infopath на хосте форм, поскольку это не wpf), написанном на c #, и мы бы предпочлииспользовать элементы .Net, предоставленные Microsoft или программным обеспечением с открытым исходным кодом.

Редактировать: В качестве более подробного примера, скажем, существует форма infopath, которая приводит к xml, который выглядит примерно так:

<Deal id="1" dateBooked="2011-01-01" term="24" language="en-us">
    <Salesman>Jim Flowers</Salesman>
    <FinancedAmount>55000.00</FinancedAmount>
    <Items>
        <Item id="1" quantity="10" unitPrice="10000.00">Tractor</Item>
        <Item id="2" quantity="1" unitPrice="5000.00">Spare Blade</Item>
    </Items>
    <Notes>
        <Note dateAdded="2010-09-20">Customer needs a spare blade</Note>
        <Note dateAdded="2010-12-31">Customer wants to sign the deal on new year's day, I find this odd...</Note>
</Deal>

Я хочу, чтобы пользователь во время выполнения и интуитивно понятным способом (пользователь не будет знать xpath ...) отображал конкретные узлы древовидной структуры этого документа в поле моего объекта "Сделка".Таким образом, объект Deal может иметь идентификатор, продавца, сумму, коллекцию товаров и т. Д., Которые необходимо заполнить, но примечания и некоторые другие данные игнорируются, и формы не будут одинаковыми (информационный путь предоставляет настраиваемые формы дляпользователь может вводить данные в систему так, как они хотят) или именовать в любом непротиворечивом вопросе.Пользователь указывает отображение.

Ответы [ 2 ]

1 голос
/ 20 августа 2011

Похоже, решение Андреаса было бы хорошим первым шагом.Похоже, что для вашего ввода нужно будет также использовать атрибуты узлов.

Мое описание вашего плана будет следующим:

  1. Создайте элемент управления, который отображает все данные(Андреас использует TreeView)
    • Возможно, вы захотите показать Имя и Значение для каждого
  2. Создать аналогичный элемент управления для объекта, в который вы загружаете
  3. Настройка событий для построения сопоставления
    • Вы упомянули о перетаскивании между ними
    • Или, если они оба являются деревьями флажков, возможно, они отметили один в дереве XML, а затем в объектедерево и сбросьте оба, создав список созданных сопоставлений
  4. Наконец, используйте этот список сопоставлений для заполнения объекта

Я не вижу простого способачтобы сделать это, нужно много работы и многое зависит от специфики реализации, поэтому я не могу просто дать вам код, который может это сделать.

Как я думаю, я мог бы сделать это, чтобы получитьэто работает быстро:

  1. RecuПройдите через xml, генерируя xpath-ы при каждом значении
  2. Загрузите все эти xpath-ы и имена и значения, которые они представляют, в таблицу, которая будет отображаться пользователю
    • Со столбцами для«Name», «Value», «xpath» -hidden, «Load Into Property» -dropdown
  3. Создайте раскрывающийся список со всеми свойствами в вашем объекте, поместите его в столбец втаблица, отображаемая для пользователя

По сути, я считаю, что вам нужно разбить это на более мелкие этапы и искать помощь по каждому конкретному этапу.

1 голос
/ 20 августа 2011

Я бы выбрал самый простой способ - создать древовидное представление из данного xml и добавить флажок для каждого узла. Когда пользователь нажимает кнопку «ОК» (или любую другую), вы повторяете все отмеченные флажки и строите свой объект.

Создание вида дерева из XML довольно просто - это должно сработать (однако я не проверял его!)

public static class TreeViewExtensions
    {
        public static void LoadXml(this TreeView treeview, XmlDocument doc)
        {
            treeview.Nodes.Clear();

            RecursiveImport(treeview.Nodes, doc.ChildNodes);
        }

        private static void RecursiveImport(TreeNodeCollection tvNodes, XmlNodeList xmlNodes)
        {
            TreeNode tvNode;

            foreach (XmlNode xmlNode in xmlNodes)
            {
                tvNode = new TreeNode(xmlNode.Name);

                if (xmlNode.ChildNodes.Count > 0)
                    RecursiveImport(tvNode.Nodes, xmlNode.ChildNodes);

                tvNodes.Add(tvNode);
            }
        }
    }

Edit: Ну, в принципе, вы можете перечислить все поля XML в списке, а все поля вашего объекта в другом. Когда пользователь перетаскивает 1 поле в список вашего объекта, вам нужно сохранить это отношение в другом объекте.

Я не знаком с wpf, но эта статья кажется довольно хорошей - http://www.codeproject.com/KB/dotnet/csdragndrop01.aspx

Тип перечисления "link" выглядит довольно многообещающе для того, чего вы пытаетесь достичь.

...