How to create an XML document using XmlDocument?

后端 未结 2 467
抹茶落季
抹茶落季 2020-11-28 22:46

how to create an XML document like this?


  
    text
    other text
  &l         


        
相关标签:
2条回答
  • 2020-11-28 23:20

    What about:

    #region Using Statements
    using System;
    using System.Xml;
    #endregion 
    
    class Program {
        static void Main( string[ ] args ) {
            XmlDocument doc = new XmlDocument( );
    
            //(1) the xml declaration is recommended, but not mandatory
            XmlDeclaration xmlDeclaration = doc.CreateXmlDeclaration( "1.0", "UTF-8", null );
            XmlElement root = doc.DocumentElement;
            doc.InsertBefore( xmlDeclaration, root );
    
            //(2) string.Empty makes cleaner code
            XmlElement element1 = doc.CreateElement( string.Empty, "body", string.Empty );
            doc.AppendChild( element1 );
    
            XmlElement element2 = doc.CreateElement( string.Empty, "level1", string.Empty );
            element1.AppendChild( element2 );
    
            XmlElement element3 = doc.CreateElement( string.Empty, "level2", string.Empty );
            XmlText text1 = doc.CreateTextNode( "text" );
            element3.AppendChild( text1 );
            element2.AppendChild( element3 );
    
            XmlElement element4 = doc.CreateElement( string.Empty, "level2", string.Empty );
            XmlText text2 = doc.CreateTextNode( "other text" );
            element4.AppendChild( text2 );
            element2.AppendChild( element4 );
    
            doc.Save( "D:\\document.xml" );
        }
    }
    

    (1) Does a valid XML file require an xml declaration?
    (2) What is the difference between String.Empty and “” (empty string)?


    The result is:

    <?xml version="1.0" encoding="UTF-8"?>
    <body>
      <level1>
        <level2>text</level2>
        <level2>other text</level2>
      </level1>
    </body>
    

    But I recommend you to use LINQ to XML which is simpler and more readable like here:

    #region Using Statements
    using System;
    using System.Xml.Linq;
    #endregion 
    
    class Program {
        static void Main( string[ ] args ) {
            XDocument doc = new XDocument( new XElement( "body", 
                                               new XElement( "level1", 
                                                   new XElement( "level2", "text" ), 
                                                   new XElement( "level2", "other text" ) ) ) );
            doc.Save( "D:\\document.xml" );
        }
    }
    
    0 讨论(0)
  • 2020-11-28 23:29

    Working with a dictionary ->level2 above comes from a dictionary in my case (just in case anybody will find it useful) Trying the first example I stumbled over this error: "This document already has a 'DocumentElement' node." I was inspired by the answer here

    and edited my code: (xmlDoc.DocumentElement.AppendChild(body))

    //a dictionary:
    Dictionary<string, string> Level2Data 
    {
        {"level2", "text"},
        {"level2", "other text"},
        {"same_level2", "more text"}
    }
    //xml Decalration:
    XmlDocument xmlDoc = new XmlDocument();
    XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null);
    XmlElement root = xmlDoc.DocumentElement;
    xmlDoc.InsertBefore(xmlDeclaration, root);
    // add body
    XmlElement body = xmlDoc.CreateElement(string.Empty, "body", string.Empty);
    xmlDoc.AppendChild(body);
    XmlElement body = xmlDoc.CreateElement(string.Empty, "body", string.Empty);
    xmlDoc.DocumentElement.AppendChild(body); //without DocumentElement ->ERR
    
    
    
    foreach (KeyValuePair<string, string> entry in Level2Data)
    {
        //write to xml: - it works version 1.
        XmlNode keyNode = xmlDoc.CreateElement(entry.Key); //open TAB
        keyNode.InnerText = entry.Value;
        body.AppendChild(keyNode); //close TAB
    
        //Write to xmml verdion 2: (uncomment the next 4 lines and comment the above 3 - version 1
        //XmlElement key = xmlDoc.CreateElement(string.Empty, entry.Key, string.Empty);
        //XmlText value = xmlDoc.CreateTextNode(entry.Value);
        //key.AppendChild(value);
        //body.AppendChild(key);
    }
    

    Both versions (1 and 2 inside foreach loop) give the output:

    <?xml version="1.0" encoding="UTF-8"?>
    <body>
        <level1>
            <level2>text</level2>
            <level2>ther text</level2>
             <same_level2>more text</same_level2>
        </level1>
    </body>
    

    (Note: third line "same level2" in dictionary can be also level2 as the others but I wanted to ilustrate the advantage of the dictionary - in my case I needed level2 with different names.

    0 讨论(0)
提交回复
热议问题