Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2015, 12:21   #1
lucky_thi13en
Пользователь
 
Регистрация: 24.09.2015
Сообщений: 12
По умолчанию TreeView в XML

У меня программа берёт кривой xml и преобразовывает его в дерево, Как теперь из этого дерева преобразовать в xml типа:
Код HTML:
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="NewDataSet" msdata:IsDataSet="true">
      <xs:complexType>
        <xs:choice maxOccurs="unbounded">
            <xs:element name="RIGA">
      <xs:element name="COD" type="xs:string" minOccurs="0" />
      <xs:element name="DES" type="xs:string" minOccurs="0" />
      <xs:element name="PZ" type="xs:string" minOccurs="0" />
      <xs:element name="QTA" type="xs:string" minOccurs="0" />
      <xs:element name="PR1" type="xs:string" minOccurs="0" />
      <xs:element name="PR2" type="xs:string" minOccurs="0" />
      <xs:element name="VOLUME" type="xs:string" minOccurs="0" />
      <xs:element name="L" type="xs:string" minOccurs="0" />
      <xs:element name="A" type="xs:string" minOccurs="0" />
      <xs:element name="P" type="xs:string" minOccurs="0" />
      <xs:element name="VAR" type="xs:string" minOccurs="0" />
      <xs:element name="FLAGS" type="xs:string" minOccurs="0" />
      <xs:element name="DETTPREZZO" type="xs:string" minOccurs="0" />
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>  
  </xs:schema>
<RIGA1>
<COD>001NNO072052-350</COD>
<DES>Корпус нижний 350x720x520</DES>
<PZ> 1</PZ>
<QTA>1</QTA>
<PR1>3294</PR1>
<PR2>0</PR2>
<VOLUME>.13</VOLUME>
<L>350</L>
<A>720</A>
<P>520</P>
<VAR>_FRO=00;_FIN=99;_TIPOTOP=13;_COLTOP=20.001;_COLFARTUK=20.001;_ALZ=05;_COLALZ=05.001;_TIPORIP=01;FINCORP=01.01;_PIE=02;_ZOC=03;_COLZOC=011</VAR>
<FLAGS>____</FLAGS>
<DETTPREZZO>01;001NNO072052-350;2032;;;;1;,0,0,0;_FRO=00;_FIN=99;_TIPOTOP=13;_COLTOP=20.001;_COLFARTUK=20.001;_ALZ=05;_COLALZ=05.001;_TIPORIP=01;FINCORP=01.01;_PIE=02;_ZOC=03;_COLZOC=011{RT16}01;MV05;256;;;;4;,0,0,0;{RT16}01;PV016;207.827;;;;0.154174;,314,16,0;</DETTPREZZO>
</RIGA1>
<RIGA2>
<COD>PLTOP40Z-R6\180-L</COD>
<DES>Планка торц. европодгиб ЛЕВ. 40з-R6/180-П</DES>
<PZ> 1</PZ>
<QTA>1</QTA>
<PR1>424</PR1>
<PR2>0</PR2>
<VOLUME>0</VOLUME>
<L>5</L>
<A>41.5</A>
<P>601</P>
<VAR></VAR>
<FLAGS>____</FLAGS>
<DETTPREZZO>01;PLTOP40Z-R6\180-L;321;;;;1;,0,0,0;</DETTPREZZO>
</RIGA2>
И так далее для всех RIGA....

Программа в приложении так как текст не влезает по количеству символов в сообщении.
Для корректной работы проги файл xml поместить в \TreeXml\bin\Debug\prev.xml

Думаю вы заметили что xml будет содержать гораздо меньше элементов и уберётся всё кроме узлов RIGA с их элементами.
Ну или хотя бы помогите записать в xml без схемы, её я как нибудь потом сам прикручу/
Предпологаю что нужно создать новое treeview в памяти запихнуть туда все нужные поля и потом всё скопом закинуть в xml, только как это сделать?
Вложения
Тип файла: rar project.rar (82.2 Кб, 7 просмотров)

Последний раз редактировалось lucky_thi13en; 26.10.2015 в 12:47.
lucky_thi13en вне форума Ответить с цитированием
Старый 26.10.2015, 14:00   #2
Akeloya
Форумчанин
 
Регистрация: 27.01.2014
Сообщений: 115
По умолчанию

Цитата:
Ну или хотя бы помогите записать в xml без схемы, её я как нибудь потом сам прикручу/
В чем проблема? Ну, для начала я вас отправлю читать матчасть про xml и xsd.

Но в целом, хмл файл со схемой выглядит так
Код:
<?xml version="1.0" encoding="utf-8"?>
<data xmlns="http://tempuri.org/data.xsd">
а xsd файл выглядит так, название файла data.xsd
Код:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="какой-то ид"
    targetNamespace="http://tempuri.org/data.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/data.xsd"
    xmlns:mstns="http://tempuri.org/data.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
Проверка целострости хмл по схеме выглядит так (последовательность вызовов, параметры сами подставите):
Код:
var catSchema = new XmlSchemaSet();
catSchema.Add(Ns.NamespaceName, путь к файлу схемы);
var custOrdDoc = XDocument.Load(путь к хмл файлу);
var errors = false;
                var error = "";
                custOrdDoc.Validate(catSchema, (o, ex) =>
                {
                    error = ex.Message;
                    errors = true;
                });
                if (errors)
                    throw new Exception(error);
Я бы всю работу с хмл делал через Linq to XML.
Схему бы я оставил в покое, за исключением двух моментов - загрузки в объектную модель приложения и выгрузки объектной модели в хмл. Т.е. два метода - Load и Save.

Легче объектную модель привязать к TreeView из WPF, это делается примерно так:
Код:
<UserControl.Resources>
        <ObjectDataProvider x:Key="Categories" ObjectType="{x:Type core:Data}" MethodName="GetCategories" IsAsynchronous="True">
        </ObjectDataProvider>
    </UserControl.Resources>
Код:
<TreeView Name="TvCategories" ItemsSource="{Binding Source={StaticResource Categories}}" Grid.Row="0" Grid.ColumnSpan="3" SelectedItemChanged="TvCategories_OnSelectedItemChanged">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate DataType="{x:Type MenuItem}" ItemsSource="{Binding Path=Chiled}">
                    <TextBlock Text="{Binding Title}"></TextBlock>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
Ну и объектная модель под этот код (namespace core):
Код:
public class Data{
public static ObservableCollection<Category> GetCategories()
        {
            return new ObservableCollection<Category>(_categories);
        }
}
Код:
 public sealed class Category : INotifyPropertyChanged
    {
        private int _id;
        private Category _parent;
        private string _title;
        private List<Category> _chiled;
        private string _path;
        public int Id { get { return _id; } set { _id = value; OnPropertyChanged("Id"); } }

        public Category Parent
        {
            get { return _parent; }
            set
            {
                _parent = value;
                OnPropertyChanged("Parent");
            }
        }

        public string Title { get{return _title;} set { _title = value;OnPropertyChanged("Title"); } }
        public string Path { get { return _path; } set { _path = value;OnPropertyChanged("Path"); } }
        public XElement Xml;
        public List<Category> Chiled { get { return _chiled; } set { _chiled = value;OnPropertyChanged("Chiled"); } }
        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        private void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            var handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
Плюсы такого подхода очевидные:
1. Объектная модель не зависит от того как представлено хранение данных и где оно реализованно. Для этого я использую прослойку отвечающую непосредственно за работу с источником данных. Т.е. могу реализовать хранилище данных в хмл, СУБД, через веб-службу, не внося изменений в объектную модель.
2. У меня нет лишних телодвижений по привязке данных к ГУИ и обновлению данных из ГУИ.
3. ХМЛ у меня проверяется схемой до загрузки.

Как написать хмл - лучше читать матчасть. Там все подробно и понятно.

Поэтому разделите важу задачу на три:
1. Разобраться с тем как сделать правильную схему и правильный хмл
2. Как загрузить схему в объектную модель приложения и как ее выгрузить, с реализацией функций добавления, изменения и удаления (без гуи)
3. Привязка объектной модели в гуи.
Akeloya вне форума Ответить с цитированием
Старый 26.10.2015, 14:05   #3
lucky_thi13en
Пользователь
 
Регистрация: 24.09.2015
Сообщений: 12
По умолчанию

спасибо огромное, попробую разобраться
lucky_thi13en вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
treeview и XML Sv. C++ Builder 2 10.05.2014 22:40
Загрузка из XML в TreeView Человек_Борща Компоненты Delphi 8 09.05.2013 10:19
TreeView to XML в WPF eg01st WPF, UWP, WinRT, XAML 0 29.01.2013 14:29
Построить treeView из XML Pon4ik C# (си шарп) 7 18.05.2012 19:07
Построение TreeView из XML maximumtf2 Общие вопросы Delphi 8 11.04.2012 00:30