[C#] Operacja zapisu do pliku .xds


(marroz28) #1

Witam, 

Mam pewien problem odnośnie formy zapisu pliku .xsd. Otóż program wczytuje plik .xsd i który następnie przedstawiany jest w postaci drzewa (TreeView), program umożliwia modyfikacje węzłów (usuwanie, dodawanie, itp.) oraz możliwość zapisania  do pliku (.xds) zmodyfikowanego drzewa. Właśnie w tym miejscu pojawia się problem, otóż wygląd pliku wczytanego w znacznym stopniu różni się od wyglądu pliku zapisanego, co uniemożliwia ponowne wczytanie zapisanego pliku (chyba trochę zamotałem). Czy byłby Ktoś w stanie pomóc podać jakieś wskazówki odnośnie tego zagadnienia?

 

Tutaj daje kod:

using System;
using System.IO;
using System.Windows.Forms;
using System.Xml;

public class XmlTreeDisplay
{
    public XmlTreeDisplay(System.Windows.Forms.TreeView tree, string filePath, XmlDocument doc)
    {
        tree.Nodes.Clear();

        doc = new XmlDocument();
        try
        {
            doc.Load(filePath);
        }
        catch (Exception err)
        {
            MessageBox.Show( "Błąd przy wczytywaniu pliku: " + err.Message);
            return;
        }

        //wysyłaj wszystkie dzieci w dokumencie
        foreach (XmlNode node in doc.ChildNodes)
        {
            if (node.NodeType != XmlNodeType.XmlDeclaration)
            {
                ConvertXmlNodeToTreeNode(node, tree.Nodes);
            }
        }
        
        
        foreach (TreeNode node in tree.Nodes)
        {
            node.ExpandAll();
        }
       
    }

   

    private void ConvertXmlNodeToTreeNode(XmlNode xmlNode,
      TreeNodeCollection treeNodes)
    {
        
        TreeNode newTreeNode = treeNodes.Add(xmlNode.Name);

        switch (xmlNode.NodeType)
        {
            case XmlNodeType.ProcessingInstruction:
            case XmlNodeType.XmlDeclaration:
                newTreeNode.Text = "<?" + xmlNode.Name + " " +
                  xmlNode.Value + "?>/n";
                break;
            case XmlNodeType.Element:
                //newTreeNode.Text = "<" + xmlNode.Name + ">";
                
                newTreeNode.Text = xmlNode.Name;
                break;
            case XmlNodeType.Attribute:
                newTreeNode.Text = xmlNode.Name;
                //newTreeNode.Text=
                break;
            case XmlNodeType.Text:
            case XmlNodeType.CDATA:
                newTreeNode.Text = xmlNode.Value;
                break;
            case XmlNodeType.Comment:
                newTreeNode.Text = "<!--" + xmlNode.Value + "-->";
                break;
        }

        if (xmlNode.Attributes != null)
        {
            foreach (XmlAttribute attribute in xmlNode.Attributes)
            {
                ConvertXmlNodeToTreeNode(attribute, newTreeNode.Nodes);
            }
        }
        foreach (XmlNode childNode in xmlNode.ChildNodes)
        {
            ConvertXmlNodeToTreeNode(childNode, newTreeNode.Nodes);
        }
    }

    StreamWriter sr;

    public void exportToXml(TreeView tree, string filename, XmlDocument doc) 
    {
        using (sr = new StreamWriter(filename))
        {
            //Write the header
            sr.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
            //Write our root node
            sr.WriteLine("<" + tree.Nodes[0].Text+ ">");
            //sr.WriteLine(tree.Nodes[0].Text);
            
            foreach (TreeNode node in tree.Nodes)
            {
                
                if (node.NextNode.Name != "")
                {
                    sr.WriteLine("<" + tree.Nodes[0].Text + "\t" + node.NextNode.Name + "/" + tree.Nodes[0].Text + ">");
                }
                
                //trzeba sprawdzic czy node posiada atrybuty jeżeli tak to stworzyć inną funkcję do zapisywania z atrubutami
                saveNode(node.Nodes);
            }
            //Close the root node
            sr.WriteLine("</" + tree.Nodes[0].Text + ">");
            //sr.WriteLine(tree.Nodes[0].Text);
            sr.Close();
        }
    }
    private void saveNode(TreeNodeCollection tnc)
    {
        foreach (TreeNode node in tnc)
        {
            //If we have child nodes, we'll write 
            //a parent node, then iterrate through
            //the children
            if (node.Nodes.Count > 0)
            {
                sr.WriteLine("<" + node.Text + ">");
                //sr.WriteLine(node.Text);
                saveNode(node.Nodes);
                sr.WriteLine("</" + node.Text + ">");
                //sr.WriteLine(node.Text);
            } 
            else //No child nodes, so we just write the text
                sr.WriteLine(node.Text);
        }
    }

}

Dla zobrazowanie dodam jeszcze grafiki jak to wygląda:

 

To jest widok oryginalnego pliku .xsd

post-83736-0-38594900-1417459555_thumb.j

Tutaj jak wygląda po wczytaniu go do programu

post-83736-0-50525900-1417459519_thumb.j

 

tak wygląda gdy próbuje wyeksportuje drzewo do pliku .xsd

post-83736-0-96357600-1417459535_thumb.j

 

Zależy mi na tym żeby dało się go wyeksportować w takiej postaci aby można go było ponownie wczytać.

Dodam jeszcze, że jestem zielony w C#, proszę o wskazówki jak to zrobić. 

Z góry dzięki 

pozdrawiam 

marroz28


(Grzelix) #2

Trochę tego nie przemyślałeś. Wyświetlając tree view atrybuty traktujesz jako dzieci, A co z dziećmi? Tak szybko brakuje mi trochę info co i jak ma być poukładane.

 

Na mój gust zrób tak:

  1. Przykładowy plik z jednym nodem (bez atrybutów)

  2. Przykładowy plik z jednym nodem i atrybutami

  3. Przykładowy plik z kilkoma nodami (dziećmi)

4 Przykładowy plik z nodami i arybutami

5 … i jeszcze z komentarzami.

 

Krok po kroku i dojdziesz co masz źle,  i nad którym fragmentem musisz popracować. Ewentualnie daj wynik gdzie konkretnie błąd to spróbujemy to poprawić razem.


(marroz28) #3

Przy próbie otwarcia tego pliku w moim programie:

<?xml version = "1.0" encoding = "UTF-8"?>
<xs:complexType name="OsobaTyp">
	<xs:sequence>
		<xs:element ref="imie" minOccurs="1" maxOccurs="unbounded"/>
		<xs:element ref="nazwisko"/>
	</xs:sequence>
	<xs:attribute ref="plec" use="required"/>
	<xs:attribute ref="email" use="optional"/>
</xs:complexType>

<xs:simpleType name="PlecTyp">
	<xs:restriction base="xs:string">
		<xs:enumeration value="k"/>
		<xs:enumeration value="m"/>
	</xs:restriction>
</xs:simpleType>

otrzymuje następujący błąd