如何在C#中构建XML?

送分小仙女□ 提交于 2020-02-27 21:51:30

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


#1楼

我尝试过的最好的方法是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)。


#2楼

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

#3楼

这取决于场景。 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 。 这是更原始的(一次写入型firehose),但是非常有效(在这里想象一个大循环):

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并不会带来太多XmlSerializer )。


#4楼

我试试看XLINQ(阅读:LINQ to XML)。 它简单,直观,易于编辑。

示例: 使用XLinq读取和写入XML


#5楼

XmlWriter是编写良好XML的最快方法。 XDocument,XMLDocument和其他一些工具也可以很好地工作,但是并未针对编写XML进行优化。 如果要尽快编写XML,则绝对应该使用XmlWriter。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!