我如何在C#中构建XML?

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


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

对于XDocument示例:

Console.WriteLine(
    new XElement("Foo",
        new XAttribute("Bar", "some & value"),
        new XElement("Nested", "data")));

或者与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);

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

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

最后,通过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);

这是映射到类的一个很好的模型,等等。 然而,如果你正在做一些简单的事情(或者如果所需的XML与对象模型没有真正的直接关系),它可能会过度杀伤。 XmlSerializer另一个问题是它不喜欢序列化不可变类型:每个东西都必须有一个公共getter和setter(除非你自己通过实现IXmlSerializable ,在这种情况下你没有通过使用XmlSerializer获得很多)。


我已经尝试过的最好的事情是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>

然后你可以简单地构建XML如下所示:

RootElement rootElement = new RootElement;
rootElement.Element1 = "Element1";
rootElement.Element2 = "Element2";
rootElement.Attribute1 = 5;
rootElement.Attribute2 = true;

或者像这样简单地从文件加载XML:

RootElement rootElement = RootElement.Load(filePath);

或者像这样保存它:

rootElement.Save(string);
rootElement.Save(textWriter);
rootElement.Save(xmlWriter);

rootElement.Untyped还会生成XElement形式的元素(从LINQ到XML)。


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)
                         )
            );
链接地址: http://www.djcxy.com/p/29917.html

上一篇: How can I build XML in C#?

下一篇: Text editor to open big (giant, huge, large) text files