在.NET中创建XML文档似乎有很多选择。什么是最好的方法?
答案 0 :(得分:5)
如果你只需要生成XML(不需要解析或编辑),最快的方法就是使用XmlWriter
(它比你使用字符串的第二个例子更优雅,更快,更不容易出错,因为你不必担心保持文档格式良好):
// Create an XmlWriterSettings object with the correct options.
var settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = ("\t");
settings.OmitXmlDeclaration = true;
// Create the XmlWriter object and write some content.
using (var writer = XmlWriter.Create("data.xml", settings))
{
writer.WriteStartElement("book");
writer.WriteElementString("item", "tesing");
writer.WriteEndElement();
writer.Flush();
}
如果你已经有一个要序列化的对象模型,你可以考虑使用XmlSerializer,但是 - 至少从我的经验来看 - 比XmlWriter慢得多,并且只能在简单的对象模型上使用。
答案 1 :(得分:4)
如果可能,我会亲自使用LINQ to XML。它远远超过DOM API 很多。当然,它确实依赖于您使用.NET 3.5 ...
请注意,如果您有任何需要转义的文本,则String.Format解决方案会崩溃。不可否认,我无法想到任何汽车品牌和型号,包括&
或<
等,但在更一般的情况下,这是一个真正的问题。
答案 2 :(得分:4)
XmlWriter有一个很好的界面,用于以流式,仅向前的方式创建文档。如果您有一个需要映射到XML的递归结构,它最有效。
我只会使用DOM API作为最后的手段。正如Jon所说,LINQ to XML是另一种方式。但是,无论你做什么,都不要回到字符串格式化,因为你需要正确的命名空间,实体引用,属性引用等细微之处。
答案 3 :(得分:4)
另一种方法是使用Xml序列化:只需创建表示(复杂)元素的类,填充表示这些元素内容的公共属性,可以使用属性提供有关布局的其他信息:[XmlElement()] ,[XmlAttribute()],... 并使用XmlSerializer创建doc:
public class Car
{
public string Make;
public string Model;
}
public class Cars
{
[XmlElement("Car")]
public Car[] cars;
}
class Program
{
public static void Save(Cars cars, string sFilename)
{
try
{
XmlSerializer ser = new XmlSerializer(cars.GetType());
FileStream fs = new FileStream(sFilename, FileMode.Create);
ser.Serialize(fs, cars);
fs.Close();
}
catch (Exception ex)
{ // Failed to save data to disk.
Debug.WriteLine(string.Format("Failed to save contents of {0}: {1}", sFilename ,ex.Message));
}
}
}
答案 4 :(得分:2)
使用Visual Studio 2008中的PasteXmlAsLinq示例。打开C:\ Program Files \ Microsoft Visual Studio 9.0 \ Samples \ 1033 \ CSharpSamples.zip并解压缩LinqSamples \ PasteXmlAsLinq文件。自述文件告诉您如何设置和使用它。
答案 5 :(得分:1)
我还没有完成,但VB是XML Literals。
答案 6 :(得分:0)
string.format(或任何其他形式的字符串连接)显然是代码气味,在实践中更加不透明,更容易出现人为错误,更难分解,因此维护性较差,并且比DOM方法。
我强烈建议DOM方法。
答案 7 :(得分:0)
您是否考虑过使用XML序列化,并将您的类消毒为XML文件
答案 8 :(得分:0)
如果您有可用于XML文档的模式文件,则可以使用xsd工具为您生成类,然后使用序列化来读取和写入XML文件。
答案 9 :(得分:0)
我正在处理的当前项目,我有很多需要存储在xml中的信息。我没有继续使用上面定义的任何方法,而是创建了自己的包装器来为我工作。我建议你也这样做。努力一次,一遍又一遍地使用它。我是Fluent Interface的忠实粉丝,因此我的api也是如此。这是一个例子
List<string> hierarchyList = new List<string>();
hierarchyList.Add("Book");
hierarchyList.Add("Product");
ConfigurationManager manager = new ConfigurationManager();
manager.FileName = "deleteme.xml";
expression = new ConfigurationManagerExpression(manager);
expression.AddNode("HierarchySet");
// ROOT_NODE_CONSTANT is the root node of document
string nodePath = manager.ROOT_NODE_CONSTANT + "/HierarchySet";
foreach (string name in hierarchyList)
{
expression.UsingNode(nodePath).AddNode("HierarchyName").AssignValue(name);
}
string panelPrefix = "PE";
string pathWithFileName = "define your path here";
manager.SaveSettings(pathWithFileName );
Let me know if you need code and I"ll post it on my blog (which I need to do eventually).
答案 10 :(得分:0)
使用MVP.XML中的XML Typed Templates。
答案 11 :(得分:0)
仅使用API并拥有大量的CreateElement,AppendChild等方法:
XmlNode carNode = xmlDocument.CreateElement("Car");
xmlDocument.DocumentElement.AppendChild(carNode);
XmlNode makeNode = xmlDocument.CreateElement("Make");
carNode.AppendChild(makeNode);
...
答案 12 :(得分:0)
为文档的每个组件使用字符串。 String.Format插入文档的值,然后LoadXml将其转换为XmlDocument:
string carString =
"<Car>" +
" <Make>{0}</Make>" +
" <Model>{1}</Model>" +
"</Car>";
XmlDocument carDoc = new XmlDocument();
carDoc.LoadXml(String.Format(carString, make, model));