在.NET中构建XML文档的最佳方法是什么?

时间:2008-11-25 12:08:53

标签: .net xml

在.NET中创建XML文档似乎有很多选择。什么是最好的方法?

13 个答案:

答案 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));