0

I'm having trouble exporting Treeview to a Xml file with proper indentation, I looked through the forum but could not find anything.

Here is a link on how to write Xml to Treeview Recursion, parsing xml file with attributes into treeview c#

Here is my code attempting to export treeview to XML

public void exportToXml(TreeView tv, string filename)
        {
            sr = new StreamWriter(filename, false, System.Text.Encoding.UTF8);
            //Write the header
            sr.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
            //Write our root node
            sr.WriteLine("<" + treeView1.Nodes[0].Text + ">");
            foreach (TreeNode node in tv.Nodes)
            {
                saveNode(node.Nodes);
            }
            //Close the root node
            sr.WriteLine("</" + treeView1.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("\t\t<" + node.Text + ">");
                    saveNode(node.Nodes);
                    sr.WriteLine("\t\t</" + node.Text + ">");
                }
                else //No child nodes, so we just write the text
                    sr.WriteLine("\t\t\t"+node.Text);    
            }    
        }

Xml Output

<?xml version="1.0" encoding="utf-8" ?>
<DataConfiguration xmln="abcefg12345" xmlns:xsi="12345abcefg" xsi:schemaLocation="12345abcefg12345abcefg">
        <Hosts>
        <Sites>
        <Site Name="ss">
        <Host Id="aa">
            Address Host="www.www.com"
        </Host Id="aa">
        <Host Id="ee">
            Address Host="www.www.com"
        </Host Id="ee">
        <Host Id="dd">
            Address Host="www.www.com"
        </Host Id="dd">
        <Host Id="pp">
            Address Scheme="ppp" Host="www.www.com" Path="www.www.com"
            Address Scheme="ppp" Host="www.www.com" Path="www.www.com/"
        </Host Id="pp">
        <Host Id="ss">
            Address Scheme="ppp" Host="www.www.com" Path="www.www.com"
            Address Scheme="ppp" Host="www.www.com" Path="www.www.com"
        </Host Id="ss">
        <Host Id="561">
            Address Host="www.www.com"
        </Host Id="561">
        </Site Name="ss">
        <Site Name="hihi">
        <Host Id="cc">
            Address Host="www.www.com"
        </Host Id="cc">
        <Host Id="sdD">
            Address Host="www.www.com"
        </Host Id="sdD">
        <Host Id="8uj">
            Address Scheme="ppp" Host="www.www.com" Path="www.www.com"
            Address Scheme="ppp" Host="www.www.com" Path="www.www.com"
        </Host Id="8uj">
        <Host Id="222">
            Address Scheme="ppp" Host="www.www.com" Path="www.www.com"
            Address Scheme="ppp" Host="www.www.com" Path="www.www.com"
        </Host Id="222">
        <Host Id="hhh">
            Address Scheme="ppp" Host="www.www.com" Path="www.www.com"
        </Host Id="hhh">
        <Host Id="hhh">
            Address Scheme="ppp" Host="www.www.com" Path="www.www.com"
        </Host Id="hhh">
        </Site Name="hihi">
        </Sites>
        <Host Id="hhh">
            Address Scheme="ppp" Host="www.www.com" Path="www.www.com"
        </Host Id="hhh">
        <Host Id="hhh">
            Address Scheme="ppp" Host="www.www.com" Path="www.www.com"
        </Host Id="hhh">
        <Host Id="hhh">
            Address Scheme="ppp" Host="www.www.com" Path="www.www.com"
        </Host Id="hhh">
        <Host Id="hhh">
            Address Scheme="ppp" Host="www.www.com" Path="www.www.com"
        </Host Id="hhh">
        </Hosts>
        <DataPools>
        <DataPool Id="sss" default="sure">
        <DataGroup Id="sss" Parent="aaa" UserCanSelectHost="sure">
        <HostId Parent="hhhh">
            I'm breaking here
        </HostId Parent="hhhh">
        <DataSources>
            empty
        </DataSources>
        </DataGroup Id="sss" Parent="aaa" UserCanSelectHost="sure">
        <DataGroup Id="ccc" UserCanSelectHost="whynot">
        <HostId>
            God I'm breaking here again, i hope you can fix me
        </HostId>
        <DataSources>
            empty
        </DataSources>
        </DataGroup Id="ccc" UserCanSelectHost="whynot">
        <DataGroup Id="sss" UserCanSelectHost="yessure">
        <HostId>
            cry face
        </HostId>
            webfg displaygroup="sss" provider="sss" id="ccc" principal="ccc" nioarc="ccc" nap="ccc" group="ccc"
            nhood port="1234"
        <ServerNames>
            <!-- insert comment -->
            <!-- insert comment -->
            <!-- insert comment -->
        <ServerName>
            myname
        </ServerName>
        <ServerName>
            yourname
        </ServerName>
        </ServerNames>
            <!-- insert comment -->
        <Implementations>
        <Implementation>
        <Name>
            yourname
        </Name>
        <Type>
            typeme
        </Type>
        <Assembly>
            visionme
        </Assembly>
        <Path>
            ohno
        </Path>
        </Implementation>
        </Implementations>
            --&gt;
            cfgman port="ccc"
            webservice provider="ccc"
            webservice provider="ccc"
            webservice provider="ccc"
        <parameters>
            useeventpush value="ccc"
        </parameters>
            webservice provider="ccc"
            pollingFrequency value="1000"
        </DataGroup Id="sss" UserCanSelectHost="yessure">
        </DataPool Id="sss" default="sure">
        <DataGroup Id="ccc " UserCanSelectHost="ccc">
        <DataGroup Id="ccc " UserCanSelectHost="ccc">
        <HostId>
            idk
        </HostId>
        <DataSources>
            empty
        </DataSources>
        </DataGroup Id="ccc " UserCanSelectHost="ccc">
        <DataGroup Id="ccc " UserCanSelectHost="ccc">
        <HostId>
            idk
        </HostId>
        <DataSources>
            empty
        </DataSources>
        </DataGroup Id="ccc " UserCanSelectHost="ccc">
        <DataGroup Id="default" UserCanSelectHost="true">
        <HostId>
            idk
        </HostId>
        </DataGroup Id="default" UserCanSelectHost="true">
        </DataGroup Id="ccc " UserCanSelectHost="ccc">
        </DataPools>
</DataConfiguration xmln="abcefg12345" xmlns:xsi="12345abcefg" xsi:schemaLocation="12345abcefg12345abcefg">

Desired Xml Output (Original Xml Document)

<?xml version="1.0" encoding="utf-8"?>
<DataConfiguration xmln="abcefg12345" xmlns:xsi="12345abcefg" xsi:schemaLocation="12345abcefg12345abcefg">
  <Hosts>
    <Sites>
        <Site Name="ss">
            <Host Id="aa">
                <Address Host="www.www.com"> </Address>
            </Host>
            <Host Id="ee">
                <Address Host="www.www.com"> </Address>
            </Host>
            <Host Id="dd">
                <Address Host="www.www.com"> </Address>
            </Host> 
            <Host Id="pp">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com"/>
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com/"/>
            </Host>
            <Host Id="ss">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com"/>
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com"/>
            </Host> 
            <Host Id="561">
                <Address Host="www.www.com"> </Address>
            </Host> 
        </Site>
        <Site Name="hihi">
            <Host Id="cc">
                <Address Host="www.www.com"> </Address>
            </Host>
            <Host Id="sdD">
                <Address Host="www.www.com"> </Address>
            </Host>
            <Host Id="8uj">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com"/>
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com"/>

            </Host>
            <Host Id="222">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com"/>
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com"/>               
            </Host>
            <Host Id="hhh">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com"/>
            </Host>
            <Host Id="hhh">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com"/>
            </Host>             
        </Site>     
    </Sites>
            <Host Id="hhh">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com"/>
            </Host>
            <Host Id="hhh">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com"/>
            </Host>
            <Host Id="hhh">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com"/>
            </Host>         
            <Host Id="hhh">
                <Address Scheme="ppp" Host="www.www.com" Path="www.www.com"/>
            </Host>

</Hosts>
<DataPools>
    <DataPool Id="sss" default="sure">
        <DataGroup Id="sss" Parent="aaa" UserCanSelectHost="sure" >
            <HostId Parent="hhhh">I'm breaking here</HostId>
            <DataSources>
                <empty/>
            </DataSources>
        </DataGroup>
        <DataGroup Id="ccc" UserCanSelectHost="whynot" >
            <HostId>God I'm breaking here again, i hope you can fix me</HostId>
            <DataSources>
                <empty/>
            </DataSources>
        </DataGroup>
        <DataGroup Id="sss" UserCanSelectHost="yessure" >
            <HostId>cry face</HostId>
                <webfg displaygroup="sss" provider="sss" id="ccc" principal="ccc" nioarc="ccc" nap="ccc" group="ccc">
                </webfg>

                <nhood port="1234"/>
            <ServerNames>
              <!-- insert comment -->
              <!-- insert comment -->
              <!-- insert comment -->
              <ServerName>myname</ServerName>
              <ServerName>yourname</ServerName>
            </ServerNames>
            <!-- insert comment -->
            <Implementations>
              <Implementation>
                <Name>yourname</Name>
                <Type>typeme</Type>
                <Assembly>visionme</Assembly>
                <Path>ohno</Path>
              </Implementation>
            </Implementations>-->
                <cfgman port="ccc" />               
                <webservice provider="ccc"  />
                <webservice provider="ccc"  />
                <webservice provider="ccc"  />
                    <parameters>
                        <useeventpush value="ccc"/>
                    </parameters>
                <webservice provider="ccc"  />
                        <pollingFrequency value="1000"/>
        </DataGroup>
    </DataPool>
    <DataGroup Id="ccc " UserCanSelectHost="ccc" >
        <DataGroup Id="ccc " UserCanSelectHost="ccc" >
            <HostId>idk</HostId>
            <DataSources>
                <empty/>
            </DataSources>
        </DataGroup>
        <DataGroup Id="ccc " UserCanSelectHost="ccc" >
            <HostId>idk</HostId>
            <DataSources>
                <empty/>
            </DataSources>
        </DataGroup>
        <DataGroup Id="default" UserCanSelectHost="true" >
            <HostId>idk</HostId>
        </DataGroup>
    </DataGroup>    
</DataPools>    
</DataConfiguration>

As you can see, the indentation is kinda off from my output, my purpose is to let user edit information on the tree nodes and save it back to the original file.

Community
  • 1
  • 1
Softmochi
  • 119
  • 1
  • 11

1 Answers1

0
public void exportToXml(TreeView tv, string filename)
    {
        sr = new StreamWriter(filename, false, System.Text.Encoding.UTF8);
        //Write the header
        sr.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
        //Write our root node
        sr.WriteLine("<" + treeView1.Nodes[0].Text + ">");
        foreach (TreeNode node in tv.Nodes)
        {
            int depth = 1;
            saveNode(node.Nodes, depth);
        }
        //Close the root node
        sr.WriteLine("</" + treeView1.Nodes[0].Text + ">");
        sr.Close();
    }

    private void saveNode(TreeNodeCollection tnc, int depth)
    {
        foreach (TreeNode node in tnc)
        {
            for(int i =0; i<depth;i++)
            {
                sr.Write("\t");
            }

            if (node.Nodes.Count > 0)
            {
                sr.WriteLine("<" + node.Text + ">");
                saveNode(node.Nodes, depth + 1);
                for(int i =0; i<depth;i++)
                {
                    sr.Write("\t");
                }
                sr.WriteLine("</" + node.Text.Split()[0] + ">");
            }
            else //No child nodes, so we just write the text
                sr.WriteLine("<" + node.Text + "/>");    
        }    
    }

if you are going to use your code you need a variable to count how deep you are in recursion and use that number of tabs

Softmochi
  • 119
  • 1
  • 11
Mat Forsberg
  • 454
  • 2
  • 10
  • Would it be better if I write it in XmlTextWriter than StreamWriter? Because XmlTextWriter have indentation properties? Also at the end of the element tag, I do not want the attributes, how should i remove it? – Softmochi Mar 16 '15 at 22:43
  • the .split(' ')[0] should get just the element name. i am not sure about the XmlTextWriter. – Mat Forsberg Mar 16 '15 at 23:06
  • the split did the magic, but the indentation is still a little bit off even with add a value of depth – Softmochi Mar 16 '15 at 23:15
  • Also in my code, I did a writeline to insert the xml declaration manually sr.WriteLine(""), is there a way to insert this line base on what the file have? Cause i'm using this code to write more than just one specific file, and I can't specify declaration because different file have different declaration. – Softmochi Mar 16 '15 at 23:27
  • got it... it should be dept +1 not depth ++ – Mat Forsberg Mar 16 '15 at 23:59