2009-08-14 48 views
11

在C#中生成XML時,將它生成爲字符串時出現問題嗎?在過去,我發現以編程方式生成XML非常繁瑣和複雜。通過字符串連接/一個字符串生成器來創建xml看起來要容易得多,但是,這感覺像是不好的做法。
我應該生成一個字符串的XML嗎?我應該生成XML作爲C#中的字符串?

+1

字符串連接是罰款,直到第一次的屬性值中包含& – AakashM 2009-08-14 14:57:32

+0

字符串連接是罰款,直到第一次什麼有什麼,你沒有考慮。 – 2009-08-14 14:59:10

+0

感謝您的所有答案。 – macleojw 2009-08-14 15:01:30

回答

13

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") 
     ) 
    ) 
); 
+0

將不得不嘗試這一點。謝謝! – macleojw 2009-08-14 15:04:27

+0

@Downvoter:小心點評爲什麼? – 2010-03-19 10:36:18

2

創建通過字符串連接的XML肯定是不好的做法。 XmlDomDocument不是非常詳細或複雜的;我一直覺得它很容易(和安全)合作。

2

不,你不應該。 .NET(以及其他平臺)中的XML庫確保您創建有效的XML,併爲您節省大量時間來解析它。另外,如果其他人需要使用您的XML並抱怨這是不正確的,那麼您可以排除實際的XML本身,並且會爲您節省很多時間來檢查您是否正確連接。

7

你試過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); 
1

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

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

我會避免通過「連接」手動創建xml。您在生成的xml中增加了錯誤的可能性。微軟的xml創建類已經過相當徹底的測試。使用它你的優勢。

3

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

  1. 創建XSD爲XML
  2. 編譯XSD爲對象
  3. 填充你的對象
  4. 反序列化的對象到XML

了好處到這樣做在剛剛創建xml使用XMLDocuments 1.它很好地定義了一個XSD。其他開發人員知道他們收到的xml是什麼(或他們正在修改什麼) 2.易於在將來進行更改。 3.在xml文檔中出現錯字錯誤的可能性要小得多。

讓我知道你是否需要任何代碼示例或額外的幫助來執行此操作。

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

+0

你的意思是序列化成XML,對吧? – 2009-08-14 14:59:56

+0

在很多情況下,這是一個非常好的方法。 – 2009-08-14 15:02:03

+0

是的,但他寫了反序列化。 – 2009-08-14 15:21:54

5

在考慮使用字符串連接而不是合適的庫生成XML之前,請閱讀XML specification。特別注意諸如字符集和字符引用等細節。

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

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

好。

很高興已分類。

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(); 
} 

你也可以在你的代碼添加identation便於理解:當你正確格式化你的代碼

+0

我也推薦http://hsivonen.iki.fi/producing-xml/寫XML時出現問題列表的摘要... – 2009-08-14 20:14:15

+0

+1實際上給出了爲什麼通過字符串連接來實現它是一個壞主意的原因 – 2009-08-18 22:11:27

2

的XmlWriter並不壞。

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(); 
}