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
Tutaj jak wygląda po wczytaniu go do programu
tak wygląda gdy próbuje wyeksportuje drzewo do pliku .xsd
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