Cách tạo tài liệu XML bằng XmlDocument?


Câu trả lời:


200

Thế còn:

#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) Tệp XML hợp lệ có yêu cầu khai báo xml không?
(2) Sự khác biệt giữa String.Empty và “” (chuỗi trống) là gì?


Kết quả là:

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

Nhưng tôi khuyên bạn nên sử dụng LINQ sang XML đơn giản hơn và dễ đọc hơn như sau:

#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" );
    }
}

5
Ví dụ đầu tiên đã giúp tôi viết một hàm mở rộng cho biểu định kiểu XSLT , hàm này trả về một tập hợp các nút cho bộ xử lý. Cảm ơn!
CodeManX

1
Tôi muốn lập luận rằng nếu bạn thay thế XmlElementvới var, là đầu tiên sẽ là xa dễ dàng hơn để làm việc với
Robert Perry

1

Làm việc với từ điển -> level2 ở trên đến từ một từ điển trong trường hợp của tôi (đề phòng mọi người thấy nó hữu ích) Thử ví dụ đầu tiên, tôi tình cờ gặp lỗi này: "Tài liệu này đã có nút 'DocumentElement'." Tôi đã được truyền cảm hứng bởi câu trả lời ở đây

và chỉnh sửa mã của tôi: (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);
}

Cả hai phiên bản (1 và 2 bên trong vòng lặp foreach) đều cho kết quả:

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

(Lưu ý: dòng thứ ba "cùng cấp 2" trong từ điển cũng có thể là cấp 2 như những dòng khác nhưng tôi muốn tận dụng lợi thế của từ điển - trong trường hợp của tôi, tôi cần cấp 2 với các tên khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.