如何在C#中构建XML?

Dan*_*rza 431 c# xml

如何在C#中生成有效的XML?

Mar*_*ell 503

这取决于场景.XmlSerializer肯定是一种方式,并具有直接映射到对象模型的优势.在.NET 3.5中XDocument,等等也非常友好.如果尺寸非常大,那么XmlWriter就是你的朋友.

对于一个XDocument例子:

Console.WriteLine(
    new XElement("Foo",
        new XAttribute("Bar", "some & value"),
        new XElement("Nested", "data")));
Run Code Online (Sandbox Code Playgroud)

或者相同XmlDocument:

XmlDocument doc = new XmlDocument();
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("Foo"));
el.SetAttribute("Bar", "some & value");
el.AppendChild(doc.CreateElement("Nested")).InnerText = "data";
Console.WriteLine(doc.OuterXml);
Run Code Online (Sandbox Code Playgroud)

如果您正在编写大量数据流,那么任何DOM方法(例如XmlDocument/ XDocument等)都会很快占用大量内存.因此,如果您从CSV编写100 MB的XML文件,您可能会考虑XmlWriter; 这是更原始的(一次写入firehose),但非常有效(想象一下这里有一个大循环):

XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();
Run Code Online (Sandbox Code Playgroud)

最后,通过XmlSerializer:

[Serializable]
public class Foo
{
    [XmlAttribute]
    public string Bar { get; set; }
    public string Nested { get; set; }
}
...
Foo foo = new Foo
{
    Bar = "some & value",
    Nested = "data"
};
new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo);
Run Code Online (Sandbox Code Playgroud)

这是一个很好的模型,用于映射到类等; 但是,如果您正在做一些简单的事情(或者如果所需的XML与对象模型没有直接关联),则可能会有些过分.另一个问题XmlSerializer是它不喜欢序列化不可变类型:一切都必须有一个公共的getter setter(除非你自己通过实现自己完成IXmlSerializable,在这种情况下,你没有通过使用获得太多XmlSerializer).

  • 不要忘记XStreamingElement,http://msdn.microsoft.com/en-us/library/system.xml.linq.xstreamingelement.aspx.:) (10认同)

小智 59

我尝试过的最好的事情是LINQ to XSD(大多数开发人员都不知道).你给它一个XSD Schema,它在后台为你生成一个完美映射的完整的强类型对象模型(基于LINQ to XML),这很容易使用 - 它更新和验证你的对象模型和XML即时的.虽然它仍然是"预览",但我没有遇到任何错误.

如果您有一个如下所示的XSD架构:

  <xs:element name="RootElement">
     <xs:complexType>
      <xs:sequence>
        <xs:element name="Element1" type="xs:string" />
        <xs:element name="Element2" type="xs:string" />
      </xs:sequence>
       <xs:attribute name="Attribute1" type="xs:integer" use="optional" />
       <xs:attribute name="Attribute2" type="xs:boolean" use="required" />
     </xs:complexType>
  </xs:element>
Run Code Online (Sandbox Code Playgroud)

然后你就可以像这样简单地构建XML:

RootElement rootElement = new RootElement;
rootElement.Element1 = "Element1";
rootElement.Element2 = "Element2";
rootElement.Attribute1 = 5;
rootElement.Attribute2 = true;
Run Code Online (Sandbox Code Playgroud)

或者只是从文件中加载XML,如下所示:

RootElement rootElement = RootElement.Load(filePath);
Run Code Online (Sandbox Code Playgroud)

或者像这样保存:

rootElement.Save(string);
rootElement.Save(textWriter);
rootElement.Save(xmlWriter);
Run Code Online (Sandbox Code Playgroud)

rootElement.Untyped 也以XElement的形式产生元素(从LINQ到XML).


小智 23

new XElement("Foo",
       from s in nameValuePairList
       select
             new XElement("Bar",
                  new XAttribute("SomeAttr", "SomeAttrValue"),
                          new XElement("Name", s.Name),
                          new XElement("Value", s.Value)
                         )
            );
Run Code Online (Sandbox Code Playgroud)


Mik*_*röm 9

XmlWriter是编写优秀XML的最快方法.XDocument,XMLDocument和其他一些工作也很好,但是没有针对编写XML进行优化.如果您想尽快编写XML,那么绝对应该使用XmlWriter.

  • 也就是说,如果您希望*computer*尽可能快地编写XML.如果您(开发人员)想要以最简单,最自然的方式创建XML,那么XmlWriter可能不是解决方案! (6认同)

Bob*_*Bob 5

过去,我创建了 XML 架构,然后使用工具生成 C# 类,这些类将序列化到该架构。XML 模式定义工具就是一个示例

http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx