在C#中生成XML時,將它生成爲字符串時出現問題嗎?在過去,我發現以編程方式生成XML非常繁瑣和複雜。通過字符串連接/一個字符串生成器來創建xml看起來要容易得多,但是,這感覺像是不好的做法。
我應該生成一個字符串的XML嗎?我應該生成XML作爲C#中的字符串?
回答
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")
)
)
);
將不得不嘗試這一點。謝謝! – macleojw 2009-08-14 15:04:27
@Downvoter:小心點評爲什麼? – 2010-03-19 10:36:18
創建通過字符串連接的XML肯定是不好的做法。 XmlDomDocument不是非常詳細或複雜的;我一直覺得它很容易(和安全)合作。
不,你不應該。 .NET(以及其他平臺)中的XML庫確保您創建有效的XML,併爲您節省大量時間來解析它。另外,如果其他人需要使用您的XML並抱怨這是不正確的,那麼您可以排除實際的XML本身,並且會爲您節省很多時間來檢查您是否正確連接。
你試過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);
使用XmlTextWriter,可以將結果放入StringBuilder中並使用結果字符串。另外,使用XmlTextWriter,您可以將內容放入流中。所以,如果您正在尋找靈活性,請使用XmlTextWriter。
如果你的問題是關於通過字符串連接構造一個xml文件,不要這樣做。如果您打算將xml文檔放在一起而沒有任何其他幫助,請使用StringBuilder。
我會避免通過「連接」手動創建xml。您在生成的xml中增加了錯誤的可能性。微軟的xml創建類已經過相當徹底的測試。使用它你的優勢。
當你生成xml時,我會在大多數情況下推薦以下方法。
- 創建XSD爲XML
- 編譯XSD爲對象
- 填充你的對象
- 反序列化的對象到XML
了好處到這樣做在剛剛創建xml使用XMLDocuments 1.它很好地定義了一個XSD。其他開發人員知道他們收到的xml是什麼(或他們正在修改什麼) 2.易於在將來進行更改。 3.在xml文檔中出現錯字錯誤的可能性要小得多。
讓我知道你是否需要任何代碼示例或額外的幫助來執行此操作。
注意:我們在構建時從xsds生成cs文件,以確保有人不會手動修改生成的代碼。
你的意思是序列化成XML,對吧? – 2009-08-14 14:59:56
在很多情況下,這是一個非常好的方法。 – 2009-08-14 15:02:03
是的,但他寫了反序列化。 – 2009-08-14 15:21:54
在考慮使用字符串連接而不是合適的庫生成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便於理解:當你正確格式化你的代碼
我也推薦http://hsivonen.iki.fi/producing-xml/寫XML時出現問題列表的摘要... – 2009-08-14 20:14:15
+1實際上給出了爲什麼通過字符串連接來實現它是一個壞主意的原因 – 2009-08-18 22:11:27
的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();
}
- 1. PHP - 在變量中生成並存儲xml作爲字符串
- 2. 我的tableadapter正在生成datetime2字段作爲字符串
- 3. 生成字符串作爲printf函數
- 4. 發送XML字符串作爲響應
- 5. 從C#中的字符串列表生成隨機字符串?
- 6. 字符串替換不工作,因爲我認爲它應該
- 7. 如何在c#中使用xml中的字符串變量作爲字符串?
- 8. 在C++中生成子字符串
- 9. C#XmlSerializer的生成錯誤的XML字符串
- 10. 如何將字符串解碼爲C#中的XML字符串
- 11. CakePhp從字符串生成XML文件
- 12. 從XML字符串生成XElement代碼
- 13. 從實體生成xml字符串
- 14. 從NSObjects動態生成XML字符串
- 15. 從rdlc xml字符串生成報告
- 16. 生成字符串中的
- 17. 的Python生成的字符串用C
- 18. 在C#中如何生成JSON正文,有鍵作爲字符串和標記作爲字符串和鍵作爲字符串和標記作爲列表
- 19. 生成SHA256字符串的目標C
- 20. 我應該如何處理D中的C字符串?
- 21. 我應該如何在PHP中生成動態查詢字符串?
- 22. 我應該將JWT放在JSON上作爲base64字符串嗎?
- 23. 如何生成XML字符串配置對象在C#
- 24. 生成字符串
- 25. 生成字符串
- 26. 生成字符串
- 27. Java中的字符串子串生成
- 28. 我應該如何在C#中設計字符串驗證類?
- 29. 我應該如何處理XML :: RPC和Drupal中的數字字符串?
- 30. 我該如何解析響應xml字符串?
字符串連接是罰款,直到第一次的屬性值中包含& – AakashM 2009-08-14 14:57:32
字符串連接是罰款,直到第一次什麼有什麼,你沒有考慮。 – 2009-08-14 14:59:10
感謝您的所有答案。 – macleojw 2009-08-14 15:01:30