簡體   English   中英

我應該在C#中將XML生成為字符串嗎?

[英]Should I generate XML as a string in C#?

在C#中生成XML時,將其生成為字符串是否存在問題? 在過去,我發現以編程方式生成XML非常冗長和復雜。 通過字符串連接/字符串構建器創建xml似乎更容易,但感覺就像是不好的做法。
我應該將XML生成為字符串嗎?

XDocument,XElement和XAttribute類使得在C#中生成xml變得更容易。 比使用XmlDocument或XmlWriter。

作為一個例子,產生這個:

<RootElement>
    <ChildElement Attribute1="Hello" Attribute2="World" />
    <ChildElement Attribute1="Foo" Attribute2="Bar" />
</RootElement>

你可以這樣做:

XDocument xDocument = new XDocument(
    new XElement("RootElement",
        new XElement("ChildElement",
            new XAttribute("Attribute1", "Hello"),
            new XAttribute("Attribute2", "World")
        ),
        new XElement("ChildElement",
            new XAttribute("Attribute1", "Foo"),
            new XAttribute("Attribute2", "Bar")
        )
    )
);

你有沒有嘗試過Linq到Xml? 它不是很冗長:

XElement xml = new XElement("contacts",
                    new XElement("contact", 
                        new XAttribute("id", "1"),
                        new XElement("firstName", "first"),
                        new XElement("lastName", "last")
                    ),
                    new XElement("contact", 
                        new XAttribute("id", "2"),
                        new XElement("firstName", "first2"),
                        new XElement("lastName", "last2")
                    )
                );
Console.Write(xml);

在考慮使用字符串連接而不是正確的庫生成XML之前,請先閱讀XML規范 特別注意字符集和字符引用等細節。

你現在可以做到。 我會等。

現在問問自己 - 你真的想要確保你的串聯字符串根據所有這些規則有效並自己編寫所有幫助函數,或者你是否想要使用經過良好測試的庫,其中所有邏輯都已封裝給你?

好。

很高興分類。

在生成xml時,我會在大多數情況下推薦以下方法。

  1. 為您的XML創建XSD
  2. 將XSD編譯為對象
  3. 填充您的對象
  4. 將對象反序列化為xml

使用XMLDocuments創建xml的好處是1.使用XSD很好地定義了它。 其他開發人員知道他們接收的xml是什么(或者他們正在修改什么)2。將來很容易改變。 3. xml文檔中拼寫錯誤的可能性要小得多。

如果您需要任何代碼示例或有關如何執行此操作的其他幫助,請與我們聯系。

注意:我們在構建時從xsds生成cs文件,以確保有人不會手動修改生成的代碼。

通過字符串連接創建XML絕對是不好的做法。 XmlDomDocument不是很冗長或復雜; 我總是發現它很容易(也很安全)。

不,你不應該。 .NET(和其他平台)中的XML庫確保您創建有效的XML,並且可以節省大量時間來擔心將其解析回來。另外,如果其他人需要使用您的XML,並且抱怨它不正確,您可以排除實際的XML本身,並且會為你節省大量的時間來檢查你是否正確連接。

在正確格式化代碼時,XmlWriter並沒有那么糟糕:

StringBuilder builder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(builder))
{
    writer.WriteStartDocument();

    writer.WriteStartElement("root");

    writer.WriteStartElement("Node1");
    writer.WriteAttributeString("att1", "value");
    writer.WriteEndElement();

    writer.WriteStartElement("Node2");
    writer.WriteString("inner text");
    writer.WriteEndElement();

    writer.WriteEndElement();

    writer.WriteEndDocument();
}

您還可以在代碼中添加標識以便於理解。

using (XmlWriter writer = XmlWriter.Create(builder))
{
    writer.WriteStartDocument();
    {
        writer.WriteStartElement("root");
        {
            writer.WriteStartElement("Node1");
            writer.WriteAttributeString("att1", "value");
            writer.WriteEndElement();

            writer.WriteStartElement("Node2");
            writer.WriteString("inner text");
            writer.WriteEndElement();
        }
        writer.WriteEndElement();
    }
    writer.WriteEndDocument();
}

使用XmlTextWriter,您可以將結果放入StringBuilder並使用生成的字符串。 此外,使用XmlTextWriter,您可以將內容放入流中。 因此,如果您正在尋找靈活性,請使用XmlTextWriter。

如果您的問題是關於通過字符串連接構建xml文件,請不要這樣做。 如果您要將xml文檔放在一起而沒有任何其他幫助,請使用StringBuilder。

我會避免通過“連接”手動創建xml。 您增加了生成的xml中的錯誤可能性。 微軟的xml創建類已經過相當徹底的測試。 使用它對您有利。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM